233 lines
7.2 KiB
XML
233 lines
7.2 KiB
XML
<?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>/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. <date value="from git" />
|
||
</div>
|
||
|
||
</body>
|
||
</html>
|