tuteurs.ens.fr/unix/chercher.tml

235 lines
7.3 KiB
Text
Raw Normal View History

<?xml version="1.0" encoding="UTF-8"?>
2002-11-16 22:27:41 +01:00
<!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>
2002-11-16 22:27:41 +01:00
<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 :
2002-11-16 22:27:41 +01:00
</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>
2002-11-16 22:27:41 +01:00
</tr>
<tr>
<td><code>**/</code></td>
<td>(étoile étoile)</td>
<td>désigne le répertoire courant et tous ses sous-répertoires.</td>
2002-11-16 22:27:41 +01:00
</tr>
</table>
<p>
Donc :
2002-11-16 22:27:41 +01:00
</p>
<table class="tableau">
<tr>
<th> Pour chercher «coucou» dans </th>
2002-11-16 22:27:41 +01:00
<th> On tape </th>
</tr>
<tr>
<td> Tous les fichiers <code>.tex</code> du répertoire où l'on se trouve </td>
2002-11-16 22:27:41 +01:00
<td> <code>grep coucou *.tex</code> </td>
</tr>
<tr>
<td> Tous les fichiers du répertoire où l'on se trouve </td>
2002-11-16 22:27:41 +01:00
<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>
2002-11-16 22:27:41 +01:00
<td> <code>grep coucou **/*.tex</code> </td>
</tr>
<tr>
<td> Tous les fichiers du répertoire courant et de ses sous-répertoires </td>
2002-11-16 22:27:41 +01:00
<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 :
2002-11-16 22:27:41 +01:00
</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
2002-11-16 22:27:41 +01:00
</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»).
2002-11-16 22:27:41 +01:00
</p>
<h3>Options de <code>grep</code></h3>
<p>
Il y a différentes options à <code>grep</code>, dont :
2002-11-16 22:27:41 +01:00
</p>
<ul>
<li> <code>grep -n</code> : indique le <em> numéro</em> de la ligne où
2002-11-16 22:27:41 +01:00
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é.
2002-11-16 22:27:41 +01:00
</li>
<li> <code>grep -i</code> (<em>ignore case</em>) : fait ignorer la
casse des caractères (différence entre majuscules et minuscules).
2002-11-16 22:27:41 +01:00
</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
2002-11-16 22:27:41 +01:00
en revue.
</li>
</ul>
<p>
Bien entendu, ces options sont compatibles entre elles :
2002-11-16 22:27:41 +01:00
</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
2002-11-16 22:27:41 +01:00
<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,
2002-11-16 22:27:41 +01:00
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
2002-11-16 22:27:41 +01:00
<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
2002-11-16 22:27:41 +01:00
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
2002-11-16 22:27:41 +01:00
(<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 :
2002-11-16 22:27:41 +01:00
</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>.
2002-11-16 22:27:41 +01:00
</p>
<h2><a name="find">Trouver un fichier : <code>find</code></a></h2>
2002-11-16 22:27:41 +01:00
<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é :
2002-11-16 22:27:41 +01:00
</p>
<p>
<code>find <em>répertoire</em> -name <em> nom-du-fichier</em></code>
2002-11-16 22:27:41 +01:00
</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).
2002-11-16 22:27:41 +01:00
</p>
<h4>Exemples :</h4>
2002-11-16 22:27:41 +01:00
<ol>
<li> Supposons que Toto cherche un fichier <code>egypte.tex</code> (qui se
trouve dans un répertoire <code>geo/</code>) :
2002-11-16 22:27:41 +01:00
<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> :
2002-11-16 22:27:41 +01:00
<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 :
2002-11-16 22:27:41 +01:00
</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
2002-11-16 22:27:41 +01:00
<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
2002-11-16 22:27:41 +01:00
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
<date value="$Date: 2007-07-17 10:03:09 $"/>.
2002-11-16 22:27:41 +01:00
</div>
</body>
</html>