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.
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.
Dans l'exemple précédent, on souhaite connaître le type de tous les fichiers du répertoire parent.
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.
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
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).
Option | Description |
print | affiche le résultat |
name motif | nom du fichier |
iname motif | idem mais sans tenir compte de la casse |
mtime +n|-n|n | nombre de jours depuis la date de dernière modification |
ctime +n|-n|n | nombre de jours depuis la date de création |
atime +n|-n|n | nombre de jours depuis la date de dernier accès |
mmin +n|-n|n | nombre de minutes depuis la date de dernière modification |
cmim +n|-n|n | nombre de minutes depuis la date de création |
amin +n|-n|n | nombre de minutes depuis la date de dernier accès |
type type | type 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 n | le fichier porte le numéro de propriétaire spécifié |
gid n | idem pour numéro de groupe |
size n | le 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 n | nombre de jours entre la création et le dernier accès au fichier |
perm +n|-n|n | valeur numérique des droits d'accès au fichier |
user nom | le propriétaire du fichier a pour nom celui passé en paramètre |
group nom | idem pour le groupe |
inum n | numéro d'inode du fichier |
links n | nombre de liens du fichier |
newer fichier | le fichier est plus récent que celui passé en paramètre |
anewer fichier | on a accédé au fichier plus récemment qu'on a modifié celui passé en paramètre |
cnewer fichier | on a accédé au fichier plus récemment qu'on a créé celui passé en paramètre |
nouser | aucun utilisateur dans le système ne correspond au UID du fichier |
nogroup | aucun groupe ne correspond au GID du fichier |
empty | le fichier est vide et il est soit un fichier normal soit un répertoire |
false | renvoie toujours faux |
true | renvoie 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.
(
expr )
force la priorité d'évaluation
!
expr
négation logique (devien vrai si était faux et inversement)
-not
expr
idem
- expr_1 expr_2
expr_2 est évaluée si expr_1 est vrai
- expr_1
-a
expr_2
idem
- expr_1
-and
expr_2
idem
- expr_1
-o
expr_2
expr_2 n'est pas évaluée si expr_1 est vrai
- expr_1
-or
expr_2
idem
- 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".
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!