tuteurs.ens.fr/unix/chercher.tml

234 lines
7.1 KiB
Text
Raw Normal View History

2002-11-16 22:27:41 +01:00
<?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<74>: <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 <20> retrouver
une cha<68>ne de caract<63>res dans des fichiers (<code>zgrep</code>, beaucoup moins
standard, s'utilise avec les fichiers compress<73>s). Nous n'entrerons pas dans
les d<>tails de la syntaxe. Il suffit de savoir que<75>:
</p>
<table>
<tr>
<td><code>*.tex</code></td>
<td>(<28>toile point tex)</td>
<td>signifie <20><>n'importe quel fichier <code>.tex</code><3E><>
(<code>*.tex</code> signifie <20><>tout ce qui ne commence pas par un point et
qui finit par <code>.tex</code><3E><>).</td>
</tr>
<tr>
<td><code>**/</code></td>
<td>(<28>toile <20>toile)</td>
<td>d<>signe le r<>pertoire courant et tous ses sous-r<>pertoires.</td>
</tr>
</table>
<p>
Donc<EFBFBD>:
</p>
<table class="tableau">
<tr>
<th> Pour chercher <20>coucou<6F> 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 <20>travail<69> dans tous les fichiers
<code>.tex </code> du r<>pertoire o<> il se trouve<76>:
</p>
<pre>
<span class="prompt">corvette ~ $</span> grep travail *.tex
caire.tex:les voit presque tous les matins, travailler par <20>quipes de deux ou
jordanie.tex:m<>ridionale, le socle ancien appara<72>t. Le travail de l'<27>rosion dans les
jordanie.tex:Le pays compte <20>galement sur les remises des travailleurs expatri<72>s qui, au
</pre>
<p>
Quand plusieurs fichiers sont parcourus, <code>grep</code> indique dans quel
fichier se trouve le mot demand<6E> (mot au sens de <20>cha<68>ne de caract<63>res<65>).
</p>
<h3>Options de <code>grep</code></h3>
<p>
Il y a diff<66>rentes options <20> <code>grep</code>, dont<6E>:
</p>
<ul>
<li> <code>grep -n</code><3E>: indique le <em> num<75>ro</em> de la ligne o<>
figure le mot.
</li>
<li> <code>grep -C</code> (<em> contexte</em>)<29>: fait figurer les deux
lignes qui pr<70>c<EFBFBD>dent et suivent la ligne o<> figure le mot recherch<63>.
</li>
<li> <code>grep -i</code> (<em>ignore case</em>)<29>: fait ignorer la
casse des caract<63>res (diff<66>rence entre majuscules et minuscules).
</li>
<li> <code>grep -c</code> (<em>count</em>)<29>: indique le nombre de lignes
o<EFBFBD> figure au moins une fois le mot recherch<63> dans chacun des fichiers pass<73>s
en revue.
</li>
</ul>
<p>
Bien entendu, ces options sont compatibles entre elles<65>:
</p>
<pre>
<span class="prompt">corvette ~ $</span> grep -nc travail caire.tex
caire.tex-371-soci<63>t<EFBFBD>. On compte environ 40\,000 de ces <20>boueurs chiffonniers qui
caire.tex-372-vivent dans de mis<69>rables bidonvilles aux abords de la capitale. On
caire.tex:373:les voit presque tous les matins, travailler par <20>quipes de deux ou
caire.tex-374-trois hommes, habill<6C>s comme des <20>pouvantails, avec des chapeaux de
caire.tex-375-paille et de vieux v<>tements h<>t<EFBFBD>roclites; accompagn<67>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><3E>: il peut arriver que le mot recherch<63> figure
tr<EFBFBD>s souvent, et qu'une s<>rie de lignes se mettent <20> d<>filer sur l'<27>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<69>: tuyau) connecte la sortie
standard d'une commande (c'est-<2D>-dire le r<>sultat visible de cette
commmande) sur l'entr<74>e standard d'une autre commande (ici
<code>less</code>); dans notre cas, cela signifie que les lignes produites
par <code>grep</code> pourront <20>tre lues avec <code>less</code>, comme un
fichier.
</p>
<p>
<strong>Lignes parasites</strong><3E>: <code>grep</code> passe en revue tous
les r<>pertoires et fichiers; quand on ne lui pr<70>cise pas la nature du fichier
(<code>*</code> et non pas <code>*.tex</code>), il signale tous les
r<EFBFBD>pertoires qu'il examine. Pour <20>liminer toutes ces lignes parasites, il faut
ajouter <code>2&gt;/dev/null</code> <20> la fin de la ligne de commande
(<code>/dev/null</code> est une sorte de poubelle o<> on redirige les donn<6E>es
dont on veut se d<>barasser). Par exemple<6C>:
</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<6C>res </a></em>.
</p>
<h2><a name="find">Trouver un fichier<65>: <code>find</code></a></h2>
<p>
<strong><code>find <em>r<>pertoire fichier</em></code></strong> sert <20>
retrouver un fichier selon certaines caract<63>ristiques (nom, taille...).
L'option <code>-name</code> sert <20> indiquer le nom du fichier recherch<63><68>:
</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<65>:</h4>
<ol>
<li> Supposons que Toto cherche un fichier <code>egypte.tex</code> (qui se
trouve dans un r<>pertoire <code>geo/</code>)<29>:
<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<EFBFBD> <code>chrono</code> et Toto se trouve dans
<code>histoire/</code><3E>:
<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>,
2002-11-16 22:27:41 +01:00
num<EFBFBD>ro<EFBFBD>2, d<>cembre 1999). Reprenons le cas<61>1; Toto sait juste
qu'il y a <20>gypt<70> dans le nom du fichier; il fera ainsi sa demande<64>:
</p>
<pre>
<span class="prompt">corvette ~ $</span> find ~ -name '*gypt*' /users/97/litt/toto/geo/egypte.tex
</pre>
<p>
<EFBFBD><EFBFBD><code>*gypt*</code><3E><> peut se comprendre comme <20><>n'importe quoi avant
et apr<70>s la suite de caract<63>res <20><>gypt<70><74>. Les <em>quotes</em>
(apostrophes) servent <20> garantir que les <20>toiles seront interpr<70>t<EFBFBD>es par
<code>find</code>, et non par le <a href="&url.jargon;#shell">shell</a>.
</p>
<p>
<strong>Find est une
commande tr<74>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<EFBFBD>: <20>milia Robin. Derni<6E>re modification le 2002-11-16.
</div>
</body>
</html>