tuteurs.ens.fr/unix/chercher.tml
2011-03-24 13:44:03 +01:00

233 lines
7.2 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="UTF-8"?>
<!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 -r --include="*.tex" coucou</code> </td>
</tr>
<tr>
<td> Tous les fichiers du répertoire courant et de ses sous-répertoires </td>
<td> <code>grep -r 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&gt;/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&gt;/dev/null
grep coucou **/* 2&gt;/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. <date value="from git" />
</div>
</body>
</html>