# Chercher

# 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 :

- `grep -n` : indique le numéro de la ligne où figure le mot.
- `grep -C` ( contexte) : fait figurer les deux lignes qui précèdent et suivent la ligne où figure le mot recherché.
- `grep -i` (ignore case) : fait ignorer la casse des caractères (différence entre majuscules et minuscules).
- `grep -c` (count) : indique le nombre de lignes où figure au moins une fois le mot recherché dans chacun des fichiers passés en revue.

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.