II. Manipulation de fichiers

Par Hugo ETIEVANT


  1. Afficher
    1. Afficher le contenu d'un fichier (cat)
    2. Affichage inverse (tac)
    3. Afficher l'entête (head)
    4. Afficher la fin (tail)
    5. Afficher écran par écran (more et less)
    6. Numérotation des lignes (nl)
    7. Affichage sans doublon (uniq)
    8. Affichage avec tri (sort)
  2. Découper (split)
  3. Différences (diff)
  4. Statistiques (wc)
  5. Type de fichier (file)
  6. Création de fichier (touch)
  7. Calcul d'un condensat (md5sum)
    1. Présentation
    2. A quoi ça sert ?
    3. Exemples
  8. Recherche de fichiers (find)
    1. Introduction
    2. Liste des critères de recherche
    3. Combinatoire des tests
  9. Combinatoire des commandes précédentes

Afficher

Sous Unix, il existe de nombreuses commandes spécialisées qui permettent d'afficher sur la sortie standard le contenu d'un fichier.

Par combinaison de ces commandes au sein de tubes, on peut former des commandes complexes très utiles.

Afficher le contenu d'un fichier (cat)

La commande cat permet d'afficher sur la sortie standard l'entier contenu d'un fichier. En voici les options :
- v (Verbose) permet de convertir les caractères spéciaux des fichiers binaires en caractères affichables
- n (Number) numérote les lignes
- b (number nonBlank) numérote que les lignes non vides
- E (show Ends) affiche le symbôle $ (dollard) à la fin de chaque ligne
- s (Squeeze blank) n'affiche au plus un ligne vide
- T (show Tab) affiche les caractères tabulations comme ^I
- A (show All) équivalent à -vET
- e équivalent à -vE
- t équivalent à -vT.

Syntaxe : cat fichier

Exemple : cat lettre.tex

L'exemple précédent affiche à l'écran le contenu du fichier lettre.tex. Si le fichier avait été binaire, l'affichage des caractères spéciaux aurait provoqué un grave disfonctionnement du terminal d'affichage.

Exemple : cat -v /bin/ls

L'ajout de l'option v permet de transformer les caractères de contrôle en caractères affichables à l'écran. Ceci est très utile pour rechercher des chaînes de caractères à l'intérieur d'un programme.

A l'origine, cat permet de concaténer des fichiers et d'en renvoyer le résultat sur la sortie standard.

Syntaxe : cat fichier_1 fichier_2 fichier_3

Exemple : cat lettre.txt rapport.txt conclusion.txt

L'exemple précédent affiche à l'écran le contenu des fichiers lettre.txt, rapport.txt et conclusion.txt.

Au lieu d'afficher sur la sortie standard le résultat de cette concaténation, on peut la rediriger vers un fichier.

Syntaxe : cat fichier_1 fichier_2 fichier_3 > fichier_4

Exemple : cat lettre.txt rapport.txt conclusion.txt > publication.txt

Ainsi le fichier publication.txt aura pour contenu la concaténation des fichiers lettre.txt, rapport.txt et conclusion.txt.

Affichage inverse (tac)

La commande tac est homologue à cat mais affiche le contenu d'un fichier en partant de la dernière ligne vers la première.

Afficher l'entête (head)

La commande head permet de n'afficher que les permières lignes d'un fichier (10 par défaut). En voici les options :
- cN affiche les N premiers octets
- nN affiche les N premières lignes
- q n'affiche pas le nom du fichier
- v affiche le nom du fichier avant d'en afficher l'entête.

Syntaxe : head fichier

Exemple : head lettre.tex

Dans cet exemple, il s'affiche les 10 premières lignes du fichier lettre.tex, si ce dernier en contient moins de 10, il sera affiché dans sa totalité.

Exemple : head -n5 lettre.tex

Affichage des 5 premières lignes.

Exemple : head -vc20 lettre.tex

Affichage des 20 permiers caractères après le nom du fichier.

Afficher la fin (tail)

La commande tail permet de n'afficher que les dernières lignes d'un fichier (10 par défaut). Elle est homologue à head et possède les mêmes attributs.

Syntaxe : tail fichier

Exemple : tail lettre.tex

Dans cet exemple, il s'affiche les 10 dernières lignes du fichier lettre.tex, si ce dernier en contient moins de 10, il sera affiché dans sa totalité.

Exemple : tail -n5 lettre.tex

Affichage des 5 dernières lignes.

Exemple : tail -vc20 lettre.tex

Affichage des 20 derniers caractères après le nom du fichier.

Afficher écran par écran (more et less)

Les commandes more et less permettent d'afficher page par page des fichiers volumineux sur la sortie stantard.

Pour passer à la page suivante : les touches fléchées. Pour effectuer un défilement vertical : touche ENTREE. Pour quitter : touche q.

Numérotation des lignes (nl)

La commande nl permet l'affichage du contenu d'un fichier et en numérote les lignes. En voici les options :
- bt numérote les lignes non-vides (par défaut)
- ba numérote toutes les lignes
- bpXXX numérote seulement les lignes qui contiennent la chaîne de caractères XXX
- sX supprime le décalage du à la numérotation et utilise le séparateur X
- s'XXX' supprime le décalage du à la numérotation et utilise la chaîne 'XXX'

Syntaxe : nl fichier

Exemple : nl lettre.tex

Affiche le contenu du fichier lettre.tex en insérant le numéro de chaque ligne en début de ligne avec un espace comme séparateur entre le numéro et le premier caractère de chaque ligne. Ne numérote que les lignes non vides. Les lignes vides sont affichées.

Exemple : nl -ba lettre.tex

Numérote et affiche toutes les lignes du fichier.
Synonyme de cat -n lettre.tex. Affichage sans doublon (uniq)

La commande uniq permet d'afficher le contenu d'un fichier ligne par ligne en ométant les doublons. En voici les options :
- u affichage sans doublon (par défaut)
- d affichage des doublons
- c comptage des doublons

Syntaxe : uniq fichier

Exemple : uniq lettre.tex

Affiche le contenu du fichier lettre.tex sur la sortie standard en ométant les duplications de lignes lorsqu'elles sont contigues.

Affichage avec tri (sort)

La commande sort permet de trier les lignes d'un fichier. En voici les options :
- b ignore les espaces en début de ligne
- d ordre alphabétique (A-Z, a-z, 0-9, espace) (par défaut)
- f ignore la casse
- n ordre numérique
- r inverse l'odre de tri.

Syntaxe : sort fichier

Exemple : sort -bdf essai.txt

Cet exemple permet de trier les lignes du fichier essai.txt dans l'ordre alphabétique (d) sans tenir compte des espaces de début de ligne (b) et sans différencier majuscules et minucules (f).

Découpage (split)

La commande split permet de découper un fichier en plusieurs plus petits. Ses options sont :
- b n (Bytes) découpage par blocs de n octets
ou
- l n (Lignes) découpage par blocs de n lignes

Syntaxe : split fichier

Exemple : split -b 135000 vacances.mpeg

Ici on découpe le fichier vacances.mpeg qui est une vidéo volumineuse en fichiers de 1.35 Mo afin de la sauvegarder sur disquettes (de capacité maximum de 1.44 Mo).

Par défaut, les fichiers issus de la découpe auront un nom ayant pour préfixe x et pour suffixe une suite de lettre du type aa, ab,ac... créés dans l'ordre lexicographique naturel (descendant de 'a' vers 'z').
Pour changer le préfixe, il suffit de le spécifier en fin de commande.

Exemple : wc -l 100 /var/log/httpd/access.log access.log.

Ici on découpe le fichier de log du serveur HTTP en plus petits fichiers de 100 lignes chacun. Dont le nom sera du type access.log.aaa, access.log.aab...

Note : pour découper des fichiers texte brut, faire la découpe en nombre de lignes. Tandis que pour découper les fichiers binaires, utiliser la découpe en nombre d'octets.

Etude d'un cas d'école : on dispose du fichier cours_de_c.pdf qu'on souhaite sauvegarder sur disquette. Or la commande ls (voir Système de fichiers sous Unix > Lister les fichiers) nous apprend qu'il fait 5.7 Mo, ce qui est trop grand pour le copier directement sur disquette.
On va dont le compresser avec l'utilitaire gzip (voir Compression > Le compresseur gzip) afin d'en réduire la taille. Le fichier résultant cours_de_c.pdf.gz fait tout de même 2.8 Mo, ce qui reste encore trop.
On va donc utiliser notre recours ultime : le saucissonage de notre fichier en plusieurs plus petits de taille 1.3 Mo pour être sûr qu'ils rentreront dans les disquettes dont on dispose.

Commande : split -b 130000 cours_de_c.pdf.gz cours_de_c.pdf.gz.

Ce qui nous crée les fichiers suivants :
cours_de_c.pdf.gz.aa (1.3 Mo)
cours_de_c.pdf.gz.ab (1.3 Mo)
cours_de_c.pdf.gz.ac (200 Ko)
que l'on va copier chacun dans une disquette.

Pour retrouver le fichier de départ, on concatène et on décompresse.

Commandes :
cat cours_de_c.pdf.gz.* > cours_de_c.pdf.gz
gunzip cours_de_c.pdf.gz
acroread cours_de_c.pdf

Différences (diff)

La commande diff permet de comparer le contenu de deux fichiers pour en conaître les différences. Ceci est très pratique pour savoir si deux fichiers ont le même contenu. En voici quelques options :
- b ignore les différences du à des espaces blancs
- B ignore les différences du à des lignes blanches
- i ignore les différences minuscules/MAJUSCULES
- q indiquer seulement si les fichiers sont différents et ne pas afficher les différences elles-mêmes
- s indiquer lorsque deux fichiers sont identiques
- r comparaison récursive des fichiers d'un répertoire, sous répertoires...

Syntaxe : diff [options] fichier_1 fichier_2

Exemple :
$ diff .signature .signature.old
3a4
> .signature.old

Ici on peut voir qu'il y a une différence entre les ligne 3 et 4 dans le fichier .signature.old où i ly a une ligne insérée. S'ils avaient été égaux, diff n'aurait rien affiché.

Exemple :
$ diff -q .signature .signature.old
Files .signature and .signature.old differ

Exemple :
$ diff -q .signature .signature
Files .signature and .signature are identical

Statistiques (wc)

La commande wc permet de compter le nombre de caractères, de mots et de lignes d'un fichier. Ses options sont :
- l (Lignes) compte le nombre de lignes
- w (Words) compte le nombre de mots
- c (Chars) compte le nombre de caractères
- L (Length max ligne) affiche la longueur de la ligne la plus longue

Syntaxe : wc fichier

Exemple : wc mail.txt

Sans options, wc renvoie atomatiquement le nombre de de lignes (l), de mots (w) et de caractères (c).

Exemple : wc -lL mail.txt

Renvoie le nombre de lignes (l) et la taille maximale d'une ligne (L).

Exemple :

$ wc mail.txt
12     108     671   mail.txt

Dans l'exemple précédent, le fichier mail.txt comporte 12 lignes, 108 mots et 671 caractères.


Type de fichier (file)

La commande file permet de connaître le type d'un fichier.

Syntaxe : file fichier

Cette commande retourne le type d'un fichier passé en paramètre. Pour opérer, elle fait appel à un fichier qui contient les signatures binaires d'un grand nombre de fichier.

Elle est par exemple capable de fournir les caractéristiques du système qui a compilé un fichier exécutable parmis plusieurs centaines.

Exemple :

$ file ../*
../DATA:       directory
../cv.doc:     Microsoft Word document
../tp6.c:      program text C++
../mail.txt:   international ascii text

Dans l'exemple précédent, on souhaite connaître le type de tous les fichiers du répertoire parent.

La précision de la commande dépend du fichier magic qu'elle appelle.


Création d'un fichier (touch)

La commande touch permet de créer un nouveau fichier vide.

Syntaxe : touch fichier

Appliquée à un fichier déjà existant, elle modifie son heure de dernier accès et met cette dernière à l'heure courante par défaut.


Calcul d'un condensat (md5sum)

Présentation

Un condensat est une somme de vérification permettant de s'assurer de l'intégrité des données. Un condensat est calculé à partir d'une fonction de hachage. Ici la fonction utilisée implémente l'algorithme MD5.

A quoi ça sert ?

Lorsque l'on transmet des messages ou des fichiers par mail, ftp ou http ; il est utile de savoir si le fichier reçu à destination n'a pas subit d'altération pendant son transfert (erreur de transmission, piratage...). Pour cela on transmet en plus du fichier un condensat.
L'émeteur E calcule le condensat C du fichier F et envoie le tout au récepteur R. Le récepteur R calcule le condensat K du fichier F et le compare à C. Si C=K alors tout va bien, sinon cela signifie que le fichier F a subit des modification durant son transfert. Et R va demander à E de le lui renvoyer.

Exemples

La fonction md5sum calcul le condensat d'un fichier selon l'algorithme MD5. En voici les options :
- b voit le fichier en binaire et pas en texte brut
- v mode verbeux
- c fichier compare le condensat avec celui enregistré dans le fichier

Syntaxe : md5sum [options] fichier

Exemple :
$ md5sum upload.zip
607cdbaeef8f20be5dcb428f007c9696 upload.zip

La commande md5sum affiche le condensat (607cdbaeef8f20be5dcb428f007c9696) et le nom du fichier (upload.zip).

Pour transmettre ce condensat, on fait une redirection de l'affichage vers un fichier.

Syntaxe : md5sum fichier > condensat

Exemple : md5sum upload.zip > upload.zip.md5

On va générer un nouveau condensat qu'on va comparer avec celui enregistré dans un fichier.

Syntaxe : md5sum -c condensat fichier

Exemple : md5sum -c upload.zip.md5 upload.zip

En cas d'erreur, il s'affiche : md5sum: MD5 check failed for 'upload.zip'.

Exemple :
$ md5sum -c upload.md5 -v
upload.zip     FAILED
md5sum: 1 of 1 file(s) failed MD5 check


Recherche de fichiers (find)

La commande find est ultra puissante, elle permet de faire une recherche sur le système de fichier et d'afficher la liste des fichiers satisfaisant à une combinaison de critères très variés.

Introduction

Syntaxe : find répertoire critères [-print]

Exemple : find . -name "*.c" -print

L'exemple précédent lance la recherche depuis le répertoire courant (.) et affiche le résultat de la recherche (print). Le critère de recherche porte sur le nom (name) et doit satisfaire le motif (expression régulière) suivant : "*.c" c'est-à-dire tous les fichiers d'extention .c (autrement dit les programmes sources écris en langage C).

Exemple : find . -mtime +7 -print

Cet exemple recherche et affiche (print) les fichiers dont la date de dernière modification (mtime : Modify Time) remonte à plus de 7 jours (+7).

On aurait pu spécifier mtime -5 pour les fichiers dont la date de dernière modification date au plus de 5 jours. Ou encore mtime 10 pour les fichiers modifiés exactement il y a 10 jours.

Liste des critères de recherche

Le tableau suivant récapitule les principales options de la commande find. Chacune de ces options (sauf la première print) sont des critères de recherche qui renvoient un bouléen vrai si le critère est satisfait, faux sinon. Si exactement tous les critères sont satisfaits, alors le fichier est considéré comme « trouvé » et est passé en paramètre à l'option print (si celle-ci est elle aussi spécifiée).

OptionDescription
printaffiche le résultat
name motifnom du fichier
iname motifidem mais sans tenir compte de la casse
mtime +n|-n|nnombre de jours depuis la date de dernière modification
ctime +n|-n|nnombre de jours depuis la date de création
atime +n|-n|nnombre de jours depuis la date de dernier accès
mmin +n|-n|nnombre de minutes depuis la date de dernière modification
cmim +n|-n|nnombre de minutes depuis la date de création
amin +n|-n|nnombre de minutes depuis la date de dernier accès
type typetype du fichier b (fichier spécial en mode bloc), c (fichier special en mode caractère), d (répertoire), p (tube nommé), f (fichier normal), l (lien symbolique), s (socket)
uid nle fichier porte le numéro de propriétaire spécifié
gid nidem pour numéro de groupe
size nle fichier est de taille spécifiée dont il faut préciser l'unité : b (bloc de 512 octets, par défaut), c (octet), k (Ko)
used nnombre de jours entre la création et le dernier accès au fichier
perm +n|-n|nvaleur numérique des droits d'accès au fichier
user nomle propriétaire du fichier a pour nom celui passé en paramètre
group nomidem pour le groupe
inum nnuméro d'inode du fichier
links nnombre de liens du fichier
newer fichierle fichier est plus récent que celui passé en paramètre
anewer fichieron a accédé au fichier plus récemment qu'on a modifié celui passé en paramètre
cnewer fichieron a accédé au fichier plus récemment qu'on a créé celui passé en paramètre
nouseraucun utilisateur dans le système ne correspond au UID du fichier
nogroupaucun groupe ne correspond au GID du fichier
emptyle fichier est vide et il est soit un fichier normal soit un répertoire
falserenvoie toujours faux
truerenvoie toujours vrai

Les options doivent êtres précédées d'un trait d'union (-) et leur paramètre éventuel séparé par un espace.

Les paramètres numériques n peuvent être passé en valeur absolue (par exemple 7) ou bien en valeur relative (+2 ou -20).

Combinatoire des tests

Chacune des options du tableau précédent constitue un test. La commande find offre une algèbre booléenne permettant de combiner à l'aide d'opérateurs les tests souhaités afin de former une expression complexe.

Les opérateurs suivants sont présentés dans l'ordre de priorité décroissante.

  1. ( expr )
    force la priorité d'évaluation

  2. ! expr
    négation logique (devien vrai si était faux et inversement)

  3. -not expr
    idem

  4. expr_1 expr_2
    expr_2 est évaluée si expr_1 est vrai

  5. expr_1 -a expr_2
    idem

  6. expr_1 -and expr_2
    idem

  7. expr_1 -o expr_2
    expr_2 n'est pas évaluée si expr_1 est vrai

  8. expr_1 -or expr_2
    idem

  9. expr_1, expr_2
    expr_1 et expr_2 sont toujours évaluées mais la valeur booléenne de la liste est celle de expr_2. La valeur de expr_1 est dont passée aux oubliettes.

Ainsi dans les exemples précédents, les critères étaient évalués de gauche à droite tant que que le précédent renvoyait vrai.

Exemple : find . -not -name ".c" -print

Cet exemple affiche sur la sortie standard la liste des fichiers qui ne portent pas l'extention ".c".


Combinatoire des commandes précédentes

Exemple :

$ tac script.txt | nl | head -n5 | tail -n3 | tac
 5  then if [ -f "/bin/$1" ]
 4       then echo "Commande externe."
 3       else echo "N'est pas une commande externe."

Dans l'exemple précédent, on renvoie successivement le résultat des commandes aux suivantes par l'intermédiaire des tubes (|). On lit à l'envers le fichier script.txt, on numérote le résultat, on en prend que les 5 premières lignes. De ces 5 premières lignes, en ne prend que les 3 dernières (c'est-à-dire en fin de compte les lignes 3 à 5). On renverse une nouvelle fois le résultat!