Chercher des mots et des fichiers sous Unix

Chercher des mots : grep mot fichiers

Syntaxe

grep mot fichiers sert à retrouver une chaîne de caractères dans des fichiers (zgrep, beaucoup moins standard, s'utilise avec les fichiers compressés). Nous n'entrerons pas dans les détails de la syntaxe. Il suffit de savoir que :

*.tex (étoile point tex) signifie « n'importe quel fichier .tex » (*.tex signifie « tout ce qui ne commence pas par un point et qui finit par .tex »).
**/ (étoile étoile) désigne le répertoire courant et tous ses sous-répertoires.

Donc :

Pour chercher «coucou» dans On tape
Tous les fichiers .tex du répertoire où l'on se trouve grep coucou *.tex
Tous les fichiers du répertoire où l'on se trouve grep coucou *
Tous les fichiers .tex du répertoire courant et de ses sous-répertoires grep -r --include="*.tex" coucou
Tous les fichiers du répertoire courant et de ses sous-répertoires grep -r coucou .

Par exemple, Toto cherche le mot «travail» dans tous les fichiers .tex du répertoire où il se trouve :

corvette ~ $ grep travail *.tex
caire.tex:les voit presque tous les matins, travailler par équipes de deux ou 
jordanie.tex:méridionale, le socle ancien apparaît. Le travail de l'érosion dans les
jordanie.tex:Le pays compte également sur les remises des travailleurs expatriés qui, au

Quand plusieurs fichiers sont parcourus, grep indique dans quel fichier se trouve le mot demandé (mot au sens de «chaîne de caractères»).

Options de grep

Il y a différentes options à grep, dont :

Bien entendu, ces options sont compatibles entre elles :

corvette ~ $ grep -nC travail caire.tex
caire.tex-371-société.  On compte environ 40\,000 de ces éboueurs chiffonniers qui
caire.tex-372-vivent dans de misérables bidonvilles aux abords de la capitale. On
caire.tex:373:les voit presque tous les matins, travailler par équipes de deux ou
caire.tex-374-trois hommes, habillés comme des épouvantails, avec des chapeaux de
caire.tex-375-paille et de vieux vêtements hétéroclites; accompagnés de leurs 
corvette ~ $ grep -c travail *.tex
caire.tex:1 
egypte.tex:0 
jordanie.tex:2 
syrie.tex:0

Confort

Défilement : il peut arriver que le mot recherché figure très souvent, et qu'une série de lignes se mettent à défiler sur l'écran, parce qu'elle n'ont pas la place d'y figurer toutes. Dans ce cas, vous pouvez taper

grep machin * | less

Le | ( pipe en anglais : tuyau) connecte la sortie standard d'une commande (c'est-à-dire le résultat visible de cette commmande) sur l'entrée standard d'une autre commande (ici less); dans notre cas, cela signifie que les lignes produites par grep pourront être lues avec less, comme un fichier.

Lignes parasites : grep passe en revue tous les répertoires et fichiers; quand on ne lui précise pas la nature du fichier (* et non pas *.tex), il signale tous les répertoires qu'il examine. Pour éliminer toutes ces lignes parasites, il faut ajouter 2>/dev/null à la fin de la ligne de commande (/dev/null est une sorte de poubelle où on redirige les données dont on veut se débarasser). Par exemple :

grep coucou **/* 2>/dev/null
grep coucou **/* 2>/dev/null | less

Allez faire les exercices sur grep et les expressions régulières.

Trouver un fichier : find

find répertoire fichier sert à retrouver un fichier selon certaines caractéristiques (nom, taille...). L'option -name sert à indiquer le nom du fichier recherché :

find répertoire -name nom-du-fichier

Le répertoire est ~ (tilde) quand on veut chercher dans tout son compte, . (point) quand on veut chercher dans le répertoire courant (et ses sous-répertoires).

Exemples :

  1. Supposons que Toto cherche un fichier egypte.tex (qui se trouve dans un répertoire geo/) :
    corvette ~ $ find ~ -name egypte.tex /users/97/litt/toto/geo/egypte.tex
    
  2. Dans ~toto/histoire/moderne/documents/ il y a un fichier appelé chrono et Toto se trouve dans histoire/ :
    corvette $ find . -name chrono ./moderne/documents/chrono
    

Si vous ne vous rappelez que d'une partie du nom du fichier, on utilise les jokers (voir le cours du Hublot sur Les jokers, numéro 2, décembre 1999). Reprenons le cas 1; Toto sait juste qu'il y a «gypt» dans le nom du fichier; il fera ainsi sa demande :

corvette ~ $ find ~ -name '*gypt*' /users/97/litt/toto/geo/egypte.tex

« *gypt* » peut se comprendre comme « n'importe quoi avant et après la suite de caractères « gypt ». Les quotes (apostrophes) servent à garantir que les étoiles seront interprétées par find, et non par le shell.

Find est une commande très puissante, qui permet de chercher un fichier non seulement en fonction de son nom, mais aussi de son type, de sa date de modification, de sa taille... Pour toutes ces options, voir les exercices sur find.

Auteur : Émilia Robin.