<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN" "tuteurs://DTD/tml.dtd"> <html> <head> <title>Chercher</title> </head> <body> <h1>Chercher des mots et des fichiers sous Unix</h1> <h2><a name="grep">Chercher des mots : <code>grep <em>mot fichiers</em></code></a></h2> <h3>Syntaxe</h3> <p> <strong><code>grep</code> <em> mot fichiers</em></strong> sert à retrouver une chaîne de caractères dans des fichiers (<code>zgrep</code>, 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 : </p> <table> <tr> <td><code>*.tex</code></td> <td>(étoile point tex)</td> <td>signifie « n'importe quel fichier <code>.tex</code> » (<code>*.tex</code> signifie « tout ce qui ne commence pas par un point et qui finit par <code>.tex</code> »).</td> </tr> <tr> <td><code>**/</code></td> <td>(étoile étoile)</td> <td>désigne le répertoire courant et tous ses sous-répertoires.</td> </tr> </table> <p> Donc : </p> <table class="tableau"> <tr> <th> Pour chercher «coucou» dans </th> <th> On tape </th> </tr> <tr> <td> Tous les fichiers <code>.tex</code> du répertoire où l'on se trouve </td> <td> <code>grep coucou *.tex</code> </td> </tr> <tr> <td> Tous les fichiers du répertoire où l'on se trouve </td> <td> <code>grep coucou *</code> </td> </tr> <tr> <td> Tous les fichiers <code>.tex</code> du répertoire courant et de ses sous-répertoires </td> <td> <code>grep coucou **/*.tex</code> </td> </tr> <tr> <td> Tous les fichiers du répertoire courant et de ses sous-répertoires </td> <td> <code>grep coucou **/*</code> </td> </tr> </table> <p> Par exemple, Toto cherche le mot «travail» dans tous les fichiers <code>.tex </code> du répertoire où il se trouve : </p> <pre> <span class="prompt">corvette ~ $</span> 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 </pre> <p> Quand plusieurs fichiers sont parcourus, <code>grep</code> indique dans quel fichier se trouve le mot demandé (mot au sens de «chaîne de caractères»). </p> <h3>Options de <code>grep</code></h3> <p> Il y a différentes options à <code>grep</code>, dont : </p> <ul> <li> <code>grep -n</code> : indique le <em> numéro</em> de la ligne où figure le mot. </li> <li> <code>grep -C</code> (<em> contexte</em>) : fait figurer les deux lignes qui précèdent et suivent la ligne où figure le mot recherché. </li> <li> <code>grep -i</code> (<em>ignore case</em>) : fait ignorer la casse des caractères (différence entre majuscules et minuscules). </li> <li> <code>grep -c</code> (<em>count</em>) : indique le nombre de lignes où figure au moins une fois le mot recherché dans chacun des fichiers passés en revue. </li> </ul> <p> Bien entendu, ces options sont compatibles entre elles : </p> <pre> <span class="prompt">corvette ~ $</span> 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 <span class="prompt">corvette ~ $</span> grep -c travail *.tex caire.tex:1 egypte.tex:0 jordanie.tex:2 syrie.tex:0 </pre> <h3>Confort</h3> <p> <strong>Défilement</strong> : 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 </p> <pre>grep machin * | less</pre> <p> Le <code>|</code> (<em> pipe</em> 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 <code>less</code>); dans notre cas, cela signifie que les lignes produites par <code>grep</code> pourront être lues avec <code>less</code>, comme un fichier. </p> <p> <strong>Lignes parasites</strong> : <code>grep</code> passe en revue tous les répertoires et fichiers; quand on ne lui précise pas la nature du fichier (<code>*</code> et non pas <code>*.tex</code>), il signale tous les répertoires qu'il examine. Pour éliminer toutes ces lignes parasites, il faut ajouter <code>2>/dev/null</code> à la fin de la ligne de commande (<code>/dev/null</code> est une sorte de poubelle où on redirige les données dont on veut se débarasser). Par exemple : </p> <pre> grep coucou **/* 2>/dev/null grep coucou **/* 2>/dev/null | less </pre> <p> <em>Allez faire les <a href="exercices/grep.html">exercices sur grep et les expressions régulières </a></em>. </p> <h2><a name="find">Trouver un fichier : <code>find</code></a></h2> <p> <strong><code>find <em>répertoire fichier</em></code></strong> sert à retrouver un fichier selon certaines caractéristiques (nom, taille...). L'option <code>-name</code> sert à indiquer le nom du fichier recherché : </p> <p> <code>find <em>répertoire</em> -name <em> nom-du-fichier</em></code> </p> <p> Le répertoire est <code>~</code> (tilde) quand on veut chercher dans tout son compte, <code> .</code> (point) quand on veut chercher dans le répertoire courant (et ses sous-répertoires). </p> <h4>Exemples :</h4> <ol> <li> Supposons que Toto cherche un fichier <code>egypte.tex</code> (qui se trouve dans un répertoire <code>geo/</code>) : <pre> <span class="prompt">corvette ~ $</span> find ~ -name egypte.tex /users/97/litt/toto/geo/egypte.tex </pre> </li> <li> Dans <code>~toto/histoire/moderne/documents/</code> il y a un fichier appelé <code>chrono</code> et Toto se trouve dans <code>histoire/</code> : <pre> <span class="prompt">corvette $</span> find . -name chrono ./moderne/documents/chrono </pre> </li> </ol> <p> <strong>Si vous ne vous rappelez que d'une partie du nom du fichier</strong>, on utilise les jokers (voir le cours du <em>Hublot</em> sur <a href="&url.tuteurs;docs/hublot/hublot02.html#usage">Les jokers</a>, 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 : </p> <pre> <span class="prompt">corvette ~ $</span> find ~ -name '*gypt*' /users/97/litt/toto/geo/egypte.tex </pre> <p> « <code>*gypt*</code> » peut se comprendre comme « n'importe quoi avant et après la suite de caractères « gypt ». Les <em>quotes</em> (apostrophes) servent à garantir que les étoiles seront interprétées par <code>find</code>, et non par le <a href="&url.jargon;#shell">shell</a>. </p> <p> <strong>Find est une commande très puissante</strong>, 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 <a href="exercices/find.html">exercices sur find</a>. </p> <div class="metainformation"> Auteur : Émilia Robin. Dernière modification le 2002-11-16. </div> </body> </html>