Alain Barraud Mémento informatique  
 
Accueil Logithèque - SE Photo - vidéo Internet - protocoles Site Web PC - Réseau Archives
Page ouverte le 28/02/2009

Manipuler les fichiers


Sommaire
On va voir comment faire pour afficher le contenu d'un fichier, le déplacer, le copier, le supprimer.

cat & less : afficher un fichier

Sous Linux, pour afficher le contenu d'un fichier, Il y a en gros 2 commandes basiques :
  • cat
  • less
Chacune de ces commandes a ses spécificités.

Dans les exemples qui suivent, on va travailler sur un fichier qui existe syslog. Il se trouve dans le dossier /var/log.

alt Le fichier s'appelle syslog tout court, et non pas syslog.txt ou syslog.log comme on pouvait avoir l'habitude de le voir sous Windows.
Un fichier sans extension peut être ouvert et lu sans aucun problème comme n'importe quel autre fichier.

cat : afficher tout le fichier

La commande cat permet d'afficher tout le contenu d'un fichier dans la console d'un coup.
Il suffit d'indiquer en paramètre le nom du fichier que l'on veut afficher, en l'occurence syslog :

Code : Console

alain@alain-pc01:/var/log$ cat syslog
Nov 14 00:44:23 alain-pc01 syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 alain-pc01 anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 alain-pc01 anacron[6725]: Normal exit (1 job run)
Nov 14 00:44:25 alain-pc01 NetworkManager: eth1: link timed out.
Nov 14 00:44:51 alain-pc01 NetworkManager: eth1: link timed out.

En fait, il y a plusieurs centaines de lignes.
La commande cat ne peut servir que sur des petits fichiers.

Peu de paramètres intéressants. A noter le paramètre -n qui permet d'afficher les numéros des lignes.

less : afficher le fichier page par page

Par rapport à cat, less est plus intéressant car permet d'afficher le contenu d'un fichier progressivement, page par page.
alain@alain-pc01:/var/log$ less syslog
Nov 14 00:44:23 alain-pc01 syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 alain-pc01 anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 alain-pc01 anacron[6725]: Normal exit (1 job run)
Nov 14 00:44:25 alain-pc01 NetworkManager: eth1: link timed out.
Nov 14 00:44:51 alain-pc01 NetworkManager: eth1: link timed out.

Ce qui est intéressant ici, c'est que la commande less a arrêté la lecture du fichier au bout de quelques lignes (la taille d'un écran de console). Cela nous laisse le temps de lire le début du fichier.

Comment lire la suite ?
Il y a quelques raccourcis clavier à connaître.

Les raccourcis basiques indispensables
ToucheEffet
EspaceAffiche la suite du fichier. La touche Espace fait défiler le fichier vers le bas d'un "écran" de console. On l'utilise souvent.
On peut aussi utiliser la touche "Page Down".
EntréeAffiche la ligne suivante. Cela permet donc de faire défiler le fichier vers le bas ligne par ligne.
On peut aussi utiliser la touche "Flèche vers le bas".
dAffiche les 11 lignes suivantes (soit une moitié d'écran). C'est un peu l'intermédiaire entre Espace (tout un écran) et Entrée (une seule ligne).
bRetourne en arrière d'un écran.
On peut aussi appuyer sur la touche "Page Up".
yRetourne d'une ligne en arrière.
On peut aussi appuyer sur la touche "Flèche vers le haut".
uRetourne en arrière d'une moitié d'écran (11 lignes).
qArrête la lecture du fichier. Cela met fin à la commande less.

alt Attention à la casse. Sous Linux, on fait souvent la différence entre les majuscules et minuscules.

Quelques raccourcis plus avancés
ToucheEffet
=Indique où on est dans le fichier (numéro des lignes affichées et pourcentage).
hAffiche l'aide (toutes les commandes que l'on voit ici, sont tirées de là). Taper "q" pour sortir de l'aide.
/Taper "/" suivi du texte que l'on recherche pour lancer le mode recherche. Faire Entrée pour valider. Pour ceux qui savent s'en servir, sachez que les expressions régulières sont acceptées (il y a un cours sur les expressions régulières dans le cours PHP).
nAprès avoir fait une recherche avec "/", la touche "n" permet d'aller à la prochaine occurence de sa recherche. C'est un peu comme si on cliquait sur le bouton "Résultat suivant".
NPareil que "n", mais pour revenir en arrière.

Nota. La commande less est très riche. Se familiariser avec est très pratique.


head & tail : afficher le début et la fin d'un fichier

head : afficher le début du fichier

La commande head ("tête" en anglaif) affiche seulement les premières lignes du fichier. Elle ne permet pas de se déplacer dans le fichier comme less, elle permet juste de récupérer les premières lignes.
Reprenons notre fichier syslog :

Code : Console

alain@alain-pc01:/var/log$ head syslog
Nov 14 00:44:23 alain-pc01 syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 alain-pc01 anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 alain-pc01 anacron[6725]: Normal exit (1 job run)
Nov 14 00:44:25 alain-pc01 NetworkManager: eth1: link timed out.
Nov 14 00:44:51 alain-pc01 NetworkManager: eth1: link timed out.

La commande head est simple, nette et efficace pour récupérer les premières lignes d'un fichier.

Un paramètre à connaître : -n, suivi d'un nombre. Il permet d'afficher le nombre de lignes que l'on veut. Par exemple, si on ne veut que les 3 premières lignes, taper :

Code : Console

alain@alain-pc01:/var/log$ head -n 3 syslog
Nov 14 00:44:23 alain-pc01 syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 alain-pc01 anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 alain-pc01 anacron[6725]: Normal exit (1 job run)

tail : afficher la fin du fichier

La commande tail nous renvoie la fin du fichier, donc les dernières lignes. Là encore utiliser -n suivi d'un nombre pour afficher les X dernières lignes

Code : Console

alain@alain-pc01:/var/log$ tail -n 3 syslog
Nov 14 22:42:08 alain-pc01 kernel: [ 7870.160000] eth1: no IPv6 routers present
Nov 14 23:11:26 alain-pc01 -- MARK --
Nov 14 23:17:01 alain-pc01 USR/SBIN/CRON[8515]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)


Un autre paramètre important : -f (f pour "follow", "suivre" en anglais).
Ce paramètre ordonne à tail de "suivre" la fin du fichier au fur et à mesure de son évolution.
Faire Ctrl + C (Ctrl et C en même temps) pour arrêter la commande tail.

alt A connaître : la combinaison de touche Ctrl + C est utilisable dans la plupart des programmes console pour demander leur arrêt.
C'est un peu l'équivalent du Alt + F4 de Windows.

Permet de voir ce qui se passe en temps réel sur un ordinateur. Noter que par défaut, tail -f recherche les nouveaux changements dans le fichier toutes les secondes. Si on veut, on peut rajouter le paramètre -s suivi d'un nombre. Par exemple, tail -f -s 3 syslog recherchera les changements toutes les 3 secondes (au lieu de toutes les secondes). Les nombres décimaux sont acceptés, à condition d'utiliser le point "." à la place de la virgule.


touch & mkdir : créer des fichiers et dossiers

touch : créer un nouveau fichier

En fait, il n'existe aucune commande spécialement faite pour créer un nouveau fichier vide sous Linux (ce n'est pas très utile). En général, on se contente d'ouvrir un éditeur de texte et d'enregistrer, ce qui provoque la création d'un nouveau fichier comme sous Windows.
La commande touch est à la base faite pour modifier la date de dernière modification d'un fichier. D'où son nom : on "touche" le fichier pour faire croire à l'ordinateur qu'on vient de le modifier alors qu'on n'a rien changé.
Si le fichier n'existe pas, il sera créé

La commande touch s'accompagne d'un paramètre : le nom du fichier à créer.
Comme on est dans /var/log, on va aller dans son dossier personnel

Code : Console

alain@alain-pc01:/var/log$ cd
alain@alain-pc01:~$

Pour le moment, il ne contient que des sous-dossiers :

Code : Console

alain@alain-pc01:~$ ls -F
Desktop/Examples@Images/Modèles/Public/Vidéos/
Documents/images/log/Musique/tutos/


Créons un fichier appelé "fichierbidon" :

Code : Console

alain@alain-pc01:~$ touch fichierbidon
alain@alain-pc01:~$ ls -F
Desktop/Examples@images/log/Musique/tutos/
Documents/fichierbidonImages/Modèles/Public/Vidéos/

En tapant ensuite la commande ls -F, on voit qu'un fichier appelé "fichierbidon" (sans extension) a été créé

On aurait pu créer un fichier avec une extension :

Code : Console

alain@alain-pc01:~$ touch autrefichierbidon.txt
alain@alain-pc01:~$ ls -F
autrefichierbidon.txtExamples@Images/Musique/Vidéos/
Desktop/fichierbidonlog/Public/
Documents/images/Modèles/tutos/


De même, on peut créer plusieurs fichiers en une seule commande :

Code : Console

touch fichierbidon autrefichierbidon.txt


Si on veut que le nom du fichier contienne un espace, il faut l'entourer de guillemets :

Code : Console

touch "fichier bidon"

mkdir : créer un nouveau dossier

La commande mkdir, elle, est faite pour créer un nouveau dossier. Elle fonctionne de la même manière que touch.

Code : Console

mkdir mondossier


On peut créer 2 dossiers (ou plus) en même temps en les séparant là aussi par des espaces :

Code : Console

mkdir mondossier autredossier


Avec mkdir, il y a un paramètre qui sert à créer les dossiers intermédiaires. Exemple :

Code : Console

mkdir -p animaux/vertebres/chat

… créera le dossier animaux, puis à l'intérieur le sous-dossier vertebres, puis à l'intérieur encore le sous-dossier chat.


cp & mv : copier et déplacer un fichier

cp : copier un fichier

La commande cp (abréviation de "CoPy", "copier" en anglais) permet de copier un fichier… mais aussi de copier plusieurs fichiers à la fois, et même de copier des dossiers.
Pour copier le fichierbidon que l'on a créé prédemment que l'on va appelé fichiercopie

Code : Console

cp fichierbidon fichiercopie

Le premier paramètre est le nom du fichier à copier, le second est le nom de la copie du fichier à créer.
En faisant cela, on aura donc 2 fichiers identiques dans le même répertoire : fichierbidon et fichiercopie.
alt Ne pas oublier d'utiliser l'autocomplétion avec la touche Tab ! Lorsqu'on a écrit "cp fic", taper Tab, et fichierbidon devrait se compléter tout seul.

Copier dans un autre dossier
Par exemple, si je veux copier fichierbidon dans le sous-dossier "mondossier" créé avant :

Code : Console

cp fichierbidon mondossier/

Le fichier fichierbidon sera copié dans mondossier sous le même nom
alt Noter que mettre le / à la fin n'est pas obligatoire. Si il est là, c'est parce que l'autocomplétion en faisant Tab l'a ajouté automatiquement.

Pour copier fichierbidon sous un autre nom :

Code : Console

cp fichierbidon mondossier/fichiercopie

Là, on a utilisé des répertoires relatifs, mais on peut aussi écrire un répertoire en absolu :

Code : Console

cp fichierbidon /var/log

… copiera fichierbidon dans le dossier /var/log.

Copier des dossiers
Avec l'option -R (R majuscule), on peut copier un dossier, ainsi que tous les sous-dossiers et fichiers qu'il contient.
Pour copier le dossier "animaux" qui contenait le sous-dossier "vertebres", contenant lui-même le dossier "chat", si on tape cette commande :

Code : Console

cp -R animaux autresanimaux

… a pour effet de copier animaux et tous ses sous-dossiers sous le nom "autresanimaux"

Utiliser le joker *
Le symbole * est appelé joker, ou encore wildcard en anglais sous linux.
Il permet de copier par exemple tous les fichiers image .jpg dans un sous-dossier :

Code : Console

cp *.jpg mondossier/


On peut aussi s'en servir pour copier tous les fichiers dont le nom commence par "so" :

Code : Console

cp so* mondossier/


Avec un outil comme le joker, la console devient progressivement plus puissante que l'explorateur de fichiers qu'on manipule à la souris.

mv : déplacer un fichier

Très proche de cp, la commande mv (MoVe, "déplacer" en anglais) a en fait 2 utilités :
  • Déplacer un fichier (ou un dossier)
  • Renommer un fichier (ou un dossier)
Déplacer un fichier
La commande mv s'utilise pratiquement comme cp :

Code : Console

mv fichierbidon mondossier/

De même, pour déplacer un dossier :

Code : Console

mv animaux/ mondossier/

… déplace le dossier animaux (et tous ses sous-dossiers) dans mondossier.

On peut aussi utiliser les jokers :

Code : Console

mv *.jpg mondossier/

Renommer un fichier
La commande mv permet de renommer un fichier. Par exemple :

Code : Console

mv fichierbidon superfichier

… renommera "fichierbidon" en "superfichier". Après cette commande, fichierbidon n'existe plus, il a été renommé.

Déplacer et renommer un fichier à la fois
Déplacer fichierbidon dans "mondossier" tout en lui affectant un nouveau nom :

Code : Console

mv fichierbidon mondossier/superfichier

alt Ne pas oublier d'utiliser l'autocomplétion de fichiers et dossiers avec la touche Tab.
Autre chose : le symbole ".." signifie "dossier précédent", et "." signifie "dossier dans lequel je me trouve". Peut servir lorsqu'on copie ou déplace un fichier.


rm : supprimer des fichiers et dossiers

Attention : il n'existe pas de corbeille dans la console de linux : le fichier est directement supprimé sans possibilité de récupération.

rm : supprimer un fichier

La commande rm (pour "ReMove", "supprimer" en anglais) peut supprimer un fichier, 2 fichiers, plusieurs fichiers, des dossiers, voire même l'ordinateur entier.
A utiliser avec précaution. Exemple, supprimons le fichierbidon :

Code : Console

rm fichierbidon

Rien à confirmer, le fichier est supprimé.

Pour supprimer plusieurs fichiers, on sépare leurs noms par des espaces :

Code : Console

rm fichierbidon fichiercopie

-i : demander confirmation
La commande -i permet de demander une confirmation pour chacun des fichiers :

Code : Console

alain@alain-pc01:~$ rm -i fichierbidon
rm: détruire fichier régulier vide `fichierbidon´?

Lorsqu'on demande une confirmation de type oui/non comme ici, on doit répondre par une lettre :
  • o : signifie Oui. Sur certains systèmes anglais, il faudra peut-être utiliser "y" de Yes.
  • n : signifie Non.
Taper ensuite sur Entrée pour valider.

-f : forcer la suppression, quoiqu'il arrive
A éviter.

-v : dis-moi ce que tu fais, petit cachotier
Le paramètre -v ("Verbose", verbeux en anglais, c'est-à-dire "parler beaucoup") est un paramètre que l'on retrouve dans beaucoup beaucoup de commandes sous Linux. Il permet de demander à la commande de dire ce qu'elle est en train de faire.

Comme on l'a vu, par défaut la commande rm est silencieuse. Si on supprime de très nombreux fichiers, ça peut prendre du temps. Pour éviter de s'impatientier, penser à utiliser -v :

Code : Console

alain@alain-pc01:~$ rm -v fichierbidon fichiercopie
détruit `fichierbidon´
détruit `fichiercopie´

On voit au fur et à mesure de l'avancement ce qui est en train d'être fait. Très pratique.

-r : supprimer un dossier et son contenu
Le paramètre -r peut être utilisé pour supprimer un dossier (au lieu d'un fichier) ainsi que tout ce qu'il contient : fichiers et dossiers.
A utiliser avec discernement car dangereux. Tout le contenu du dossier disparaîtera.

Code : Console

rm -r animaux/

alt Il existe aussi la commande rmdir. La grosse différence avec rm -r, c'est que rmdir ne peut supprimer un dossier que s'il est vide ! Il faudra avoir fait le ménage dedans auparavant.

rm et le joker de la Mort (qui tue)

L'erreur n°1 à ne pas faire sous Linux

Code : Console

NON NON NON NE JAMAIS FAIRE ÇA !!! => rm -rf /*

  • rm : commande la suppression
  • -r : suppression récursive de tous les fichiers et dossiers
  • -f : force la suppression sans demander la moindre confirmation
  • /* : supprime tous les fichiers et dossiers qui se trouvent à la racine (/) quel que soit leur nom (joker *).
En clair, cette commande supprime tout votre disque dur depuis la racine.

En fait, ce n'est pas tout à fait vrai. Il y a plusieurs mécanismes de protection. Voir le chapitre sur les droits. Par exemple, les dossiers à la racine appartiennent au super-utilisateur "root". La suppression sera refusé si on est pas loguer en tant que tel.

Le joker reste néanmoins très utile, mais faire très, très attention. Par exemple :

Code : Console

rm -rf *

… supprime tous les fichiers et sous-dossiers du dossier dans lequel je me trouve. Il n'y a qu'un seul caractère de différence (le /) avec la commande de la Mort.


ln : créer des liens entre fichiers

Permet de créer des raccourcis.
Ces "raccourcis", sont appellés liens sous Linux, plus complexes que sous Windows. En effet, on peut créer 2 types de liens :
  • Des liens physiques
  • Des liens symboliques
Ces 2 types ne fonctionnent pas de la même manière. Pour comprendre ce qui les différencie, il faut savoir comment un OS tel que Linux gère les fichiers sur le disque dur.

Le stockage des fichiers

Sur le disque dur, chaque fichier est grosso-modo séparé en 2 parties :
  • Son nom
  • Son contenu
Donc, la liste des noms de fichiers est stockée à un autre endroit que leur contenu. Cette séparation aide Linux à s'organiser.
alt Il y en fait 3 parties : le nom, les informations de gestion (droits d'accès) et le contenu.
Pour simplifier, on ne prend en compte que le nom et le contenu.

Chaque contenu de fichier se voit attribuer un numéro d'identification appelé inode. Chaque nom de fichier est donc associé à un inode (son contenu).
inodes


Comment créer des liens physiques puis des liens symboliques.

Créer des liens physiques

Plus rarement utilisé que le lien symbolique.

Un lien physique permet d'avoir 2 noms de fichiers qui partagent exactement le même contenu, c'est-à-dire le même inode :
inodes


Que l'on passe par fichier1 ou par fichier2, on modifie exactement le même contenu. En quelque sorte, le fichier est le même. On peut juste y accéder via 2 noms de fichiers différents.
alt On ne peut pas créer de liens physiques sur des répertoires. Cela ne fonctionne qu'avec les fichiers.
Il existe des options pour que ça fonctionne avec des répertoires mais c'est un peu particulier et on n'en parlera pas. Pour faire un "raccourci" vers un répertoire, on préfèrera utiliser un lien symbolique.

Pour créer un lien physique, nous allons utiliser la commande ln. On va tout d'abord créer un répertoire pour nos tests :

Code : Console

mkdir tests
cd tests

Une fois dans ce dossier, créons un fichier avec la commande touch par exemple :

Code : Console

touch fichier1

créons un lien physique : on crée un "fichier2" qui partagera le même inode (le même contenu) que "fichier1". Taper :

Code : Console

ln fichier1 fichier2

Si on liste les fichiers du répertoire, on a l'impression d'avoir 2 fichiers différents :

Code : Console

alain@alain-pc01:~/tests$ ls -1
total 0
-rw-r--r-- 2 alain alain 0 2008-07-31 13:55 fichier1
-rw-r--r-- 2 alain alain 0 2008-07-31 13:55 fichier2

A priori, rien ne permet ici de deviner que ces fichiers modifient le même contenu. Le lien physique est donc un lien dur, pas évident à détecter au premier coup d'œil.
alt La seconde colonne de la liste (qui indique "2" pour chacun des fichiers) correspond au nombre de fichiers qui partagent le même inode. C'est le seul indice qui permet de savoir que quelqu'un a fait un lien physique, mais on ne peut pas savoir lequel. Le seul moyen de vérifier que ces fichiers partagent le même contenu, c'est de faire ls -i pour afficher les numéros d'inode correspondants et de vérifier que ces 2 fichiers sont associés au même inode.
En temps normal, sur la plupart des fichiers la seconde colonne indique donc "1". Si c'est un dossier, ce nombre indique en revanche le nombre de fichiers à l'intérieur.

Si on supprime un des deux fichiers, l'autre fichier reste en place et le contenu sera toujours présent sur le disque. L'inode est supprimé uniquement quand plus un seul nom de fichier ne pointe dessus.
Donc, supprimer "fichier1" pour voir. On voit que "fichier2" existe toujours et qu'il affiche toujours le même contenu. Il faut supprimer fichier1 ET fichier2 pour supprimer le contenu.

Créer des liens symboliques

Les liens symboliques ressemblent plus aux "raccourcis" comme sous Windows. La plupart du temps, on crée des liens symboliques sous Linux pour faire un raccourci, et non des liens physiques qui sont un peu particuliers.

Le principe du lien symbolique est que l'on crée un lien vers un autre nom de fichier. Cette fois, on pointe vers le nom de fichier et non vers l'inode directement :
inodes


Supprimer le "fichier2" que nous avons créé auparavant (sous forme de lien physique) :

Code : Console

rm fichier2

Créer maintenant un nouveau fichier2, cette fois sous forme de lien symbolique. On utilise là encore la commande ln, mais cette fois avec le paramètre -s (s comme symbolique) :

Code : Console

ln -s fichier1 fichier2

Cette fois, la commande détaillée ls -l sera beaucoup plus précise :

Code : Console

alain@alain-pc01:~/tests$ ls -1
total 0
-rw-r--r-- 1 alain alain 0 2008-07-31 13:55 fichier1
lrwxrwxrwx 1 alain alain 0 2008-07-31 13:55 fichier2 -> fichier1

On note 2 choses :
  • La toute première lettre de la seconde ligne est un "l" (comme link, c'est-à-dire lien).
  • Tout à la fin de la seconde ligne, une flèche montre clairement que fichier2 pointe vers fichier1.
Les liens symboliques sont beaucoup plus faciles à repérer que les liens physiques.

Subtilités entre liens physiques et liens symboliques :
  • Par exemple, si on supprime fichier2, il ne se passe rien de mal. Par contre, si on supprime fichier1, fichier2 pointera vers un fichier qui n'existe plus. Le lien symbolique sera cassé et ne servira donc plus à rien. On parle de "lien mort".
  • D'autre part, l'avantage des liens symboliques est qu'ils fonctionnent aussi sur des répertoires, contrairement aux liens physiques.