Sophie

Sophie

distrib > Mandriva > 10.0-com > i586 > by-pkgid > 664c05250964d29fcf1d0bb310959fbc > files > 34

mandrake-doc-fr-10.0-5.1.100mdk.noarch.rpm

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>find : rechercher des fichiers selon
certains critères</title><meta name="generator" content="DocBook XSL Stylesheets V1.64.0"><link rel="home" href="index.html" title="Manuel de référence"><link rel="up" href="cmdutils.html" title="Chapitre 5. Les utilitaires en ligne de commande"><link rel="previous" href="command-files.html" title="Opérations sur les fichiers et filtres"><link rel="next" href="command-sheduling.html" title="Programmation de démarrage de
	   commandes"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">find : rechercher des fichiers selon
certains critères</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="command-files.html">Précédent</a> </td><th width="60%" align="center">Chapitre 5. Les utilitaires en ligne de commande</th><td width="20%" align="right"> <a accesskey="n" href="command-sheduling.html">Suivant</a></td></tr></table><hr></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="command-find"></a>find : rechercher des fichiers selon
certains critères</h2></div></div><div></div></div><p><a name="BId-cmdutils-pa50"></a><a class="indexterm" name="BIdNEW-cmdutils-it9"></a> <a class="indexterm" name="BId-cmdutils-it2"></a><span><b class="command">find</b></span> est un
    utilitaire <span class="application">UNIX</span> de longue date. Son but est de parcourir
    récursivement un ou plusieurs répertoires et d'y trouver des
    fichiers correspondant à un certain ensemble de critères. Bien
    qu'il soit très utile, sa syntaxe est vraiment complexe, et
    l'utiliser requiert une certaine habitude. La syntaxe générale
    est :


<a name="BId-cmdutils-sc6"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">find [options] [répertoires] [critère] [action]
</pre></td></tr></table><p>

Si vous ne spécifiez aucun répertoire, <span><b class="command">find</b></span> recherchera
dans le répertoire courant. L'absence de critère équivaut à
« <span class="quote">vrai</span> », et donc tous les fichiers seront trouvés. Les options,
les critères et les actions possibles sont si nombreux que nous n'en
mentionnerons ici que quelques-uns. Commençons par les options :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-cmdutils-pa51"></a><tt class="option">-xdev</tt> : ne
	pas étendre la recherche aux répertoires se trouvant sur
	d'autres systèmes de fichiers.
</p></li><li><p><a name="BId-cmdutils-pa52"></a><tt class="option">-mindepth
      &lt;n&gt;</tt> : descendre d'au moins
      <tt class="option">&lt;n&gt;</tt> niveaux au-dessous du répertoire de
     recherche avant de chercher des fichiers.
    </p></li><li><p><a name="BId-cmdutils-pa53"></a><tt class="option">-maxdepth
      &lt;n&gt;</tt> : rechercher les fichiers se trouvant au
      plus <tt class="literal">n</tt> niveaux au-dessous du répertoire de
      recherche.</p></li><li><p><a name="BId-cmdutils-pa54"></a><tt class="option">-follow</tt> :
     suivre les liens symboliques s'il pointent vers des
     répertoires. Par défaut, <span><b class="command">find</b></span> ne les suivra
     pas.
    </p></li><li><p><a name="BId-cmdutils-pa55"></a><tt class="option">-daystart</tt> :
quand il est fait usage de tests relatifs à la date et à l'heure (voir
ci-dessous), prendre le début de la journée courante comme repère au
lieu de la marque par défaut (24 heures avant l'heure
courante).</p></li></ul></div><p><a name="BId-cmdutils-pa56"></a>Un critère peut être un ou plusieurs tests <a name="BId-cmdutils-gt1" href="glossary.html#term-atomic"><i class="glossterm">atomiques</i></a>; quelques tests utiles sont :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-cmdutils-pa57"></a><tt class="option">-type
&lt;type&gt;</tt> : rechercher un type de fichiers
donné ; <tt class="option">&lt;type&gt;</tt> peut être :
<tt class="literal">f</tt> (fichier normal), <tt class="literal">d</tt>
(répertoire), <tt class="literal">l</tt> (lien symbolique),
<tt class="literal">s</tt> (<span class="foreignphrase"><i class="foreignphrase">socket</i></span>),
<tt class="literal">b</tt> (fichier en mode bloc), <tt class="literal">c</tt>
(fichier en mode caractère) ou <tt class="literal">p</tt> (tube nommé).
</p></li><li><p><a name="BId-cmdutils-pa58"></a><tt class="option">-name
&lt;motif&gt;</tt> : trouver les fichiers dont les noms
correspondent au <tt class="option">&lt;motif&gt;</tt> donné. Avec cette
option, <tt class="option">&lt;motif&gt;</tt> est traité comme un <i class="glossterm"><a name="BId-cmdutils-gt2"></a>motif d'englobement</i> du <span class="foreignphrase"><i class="foreignphrase">shell</i></span>
(voir le chapitre <a href="glob-regex.html" title="Motifs d'englobement du shell">la section intitulée « Motifs d'englobement du shell »</a>).</p></li><li><p><a name="BId-cmdutils-pa59"></a><tt class="option">-iname
&lt;motif&gt;</tt> : comme <tt class="option">-name</tt>, mais ne
tient pas compte de la casse.</p></li><li><p><a name="BId-cmdutils-pa60"></a><tt class="option">-atime
&lt;n&gt;</tt>, <tt class="option">-amin &lt;n&gt;</tt> : trouver
les fichiers dont la dernière date d'accès remonte à
<tt class="option">&lt;n&gt;</tt> jours (<tt class="option">-atime</tt>) ou
<tt class="option">&lt;n&gt;</tt> minutes (<tt class="option">-amin</tt>). Vous
pouvez aussi spécifier <tt class="option">+&lt;n&gt;</tt> ou
<tt class="option">-&lt;n&gt;</tt>, auquel cas la recherche sera effectuée
pour des fichiers dont la date d'accès remonte à au plus ou au moins
<tt class="option">&lt;n&gt;</tt> jours/minutes.</p></li><li><p><a name="BId-cmdutils-pa61"></a><tt class="option">-anewer
&lt;fichier&gt;</tt> : trouver les fichiers dont la dernière
date d'accès est plus récente que celle du fichier
<tt class="option">&lt;fichier&gt;</tt>
            </p></li><li><p><a name="BId-cmdutils-pa62"></a><tt class="option">-ctime
&lt;n&gt;</tt>, <tt class="option">-cmin &lt;n&gt;</tt>, <tt class="option">-cnewer
&lt;fichier&gt;</tt> : même chose que pour
<tt class="option">-atime</tt>, <tt class="option">-amin</tt> et
<tt class="option">-anewer</tt>, mais s'applique à la dernière date de
changement du contenu des fichiers.
</p></li><li><p><a name="BId-cmdutils-pa63"></a><tt class="option">-regex
&lt;motif&gt;</tt> : comme pour <tt class="option">-name</tt>, mais
<tt class="literal">motif</tt> est traité comme une <i class="glossterm"><a name="BId-cmdutils-gt3"></a>expression régulière</i>.</p></li><li><p><a name="BId-cmdutils-pa64"></a><tt class="option">-iregex
&lt;motif&gt;</tt> : comme <tt class="option">-regex</tt>, mais sans
tenir compte de la casse.</p></li></ul></div><p><a name="BId-cmdutils-pa65"></a>Beaucoup d'autres tests existent, référez-vous à
<span class="citerefentry"><span class="refentrytitle"><a name="BId-cmdutils-rt1"></a><span><b class="command">find</b></span></span>(1)</span> pour plus de détails. Pour
combiner ces tests, vous pouvez utiliser :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-cmdutils-pa66"></a><tt class="option">&lt;c1&gt;</tt> -a
&lt;c2&gt; : vrai si <tt class="option">&lt;c1&gt;</tt> et
<tt class="option">&lt;c2&gt;</tt> sont vrais tous les deux;
<tt class="option">-a</tt> est implicite, donc vous pouvez utiliser
<tt class="option">&lt;c1&gt;</tt> &lt;c2&gt; &lt;c3&gt; ... si vous voulez
que tous les tests <tt class="option">&lt;c1&gt;</tt>,
<tt class="option">&lt;c2&gt;</tt>, ... soient vérifiés.
</p></li><li><p><a name="BId-cmdutils-pa67"></a><tt class="option">&lt;c1&gt;</tt> -o
&lt;c2&gt; : vrai si l'un de <tt class="option">&lt;c1&gt;</tt> ou
<tt class="option">&lt;c2&gt;</tt> est vrai, ou les deux. Notez que
<tt class="option">-o</tt> a une <a name="BId-cmdutils-gt4" href="glossary.html#term-precedence"><i class="glossterm">priorité</i></a> moins grande que
<tt class="option">-a</tt>, donc si vous voulez, par exemple, que les
fichiers correspondent aux critères <tt class="option">&lt;c1&gt;</tt> ou
<tt class="option">&lt;c2&gt;</tt> et qu'ils vérifient obligatoirement le
critère <tt class="option">&lt;c3&gt;</tt>, vous devrez utiliser des
parenthèses et écrire <tt class="option">( &lt;c1&gt;</tt> -o &lt;c2&gt; ) -a
&lt;c3&gt;. Vous devez <a name="BId-cmdutils-gt5" href="glossary.html#term-escape"><i class="glossterm">échapper</i></a> (désactiver) les
parenthèses, sans quoi le <span class="foreignphrase"><i class="foreignphrase">shell</i></span> les prendra en compte dans son
interprétation !
</p></li><li><p><a name="BId-cmdutils-pa68"></a><tt class="option">-not
      &lt;c1&gt;</tt> : inverse le test
     <tt class="option">&lt;c1&gt;</tt>, donc <tt class="option">-not
      &lt;c1&gt;</tt> est vrai si <tt class="option">&lt;c1&gt;</tt> est
     faux.
    </p></li></ul></div><p><a name="BId-cmdutils-pa69"></a>Enfin, vous pouvez demander une action précise pour chaque
      fichier retrouvé. Les plus fréquentes sont :</p><div class="orderedlist"><ol type="1"><li><p><a name="BId-cmdutils-pa70"></a><tt class="option">-print</tt> :
écrit seulement le nom de chaque fichier sur la sortie standard. C'est
l'action par défaut si vous n'en spécifiez aucune.</p></li><li><p><a name="BId-cmdutils-pa71"></a> <tt class="option">-ls</tt> :
     affiche l'équivalent d'un <span><b class="command">ls -ilds</b></span> sur chaque
     fichier trouvé sur la sortie standard.</p></li><li><p><a name="BId-cmdutils-pa72"></a><tt class="option">-exec &lt;commande&gt;</tt> : exécute la commande
<tt class="option">&lt;commande&gt;</tt> sur chaque fichier trouvé. La ligne de
commande <tt class="option">&lt;command</tt>&gt; doit se terminer par un
<tt class="literal">;</tt>, que vous devez désactiver de telle sorte que le
<span class="foreignphrase"><i class="foreignphrase">shell</i></span> ne l'interprète pas  la position du fichier dans la commande est repérée
par <tt class="literal">{}</tt>. Regardez les exemples d'utilisation pour
bien comprendre.</p></li><li><p><a name="BId-cmdutils-pa73"></a><tt class="option">-ok
&lt;commande&gt;</tt> : même chose que <tt class="option">-exec</tt>
mais demande confirmation pour chaque commande.</p></li></ol></div><p><a name="BId-cmdutils-pa74"></a>
Toujours là ? Alors, maintenant entraînons-nous un peu, c'est après
tout la meilleure façon de maîtriser ce monstre ! On supposera
ceci : vous désirez trouver tous les répertoires dans
<tt class="filename">/usr/share</tt>. Tapez alors :</p><p><a name="BId-cmdutils-pa75"></a>

<a name="BId-cmdutils-sc7"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">find /usr/share -type d</pre></td></tr></table><p>
      </p><p><a name="BId-cmdutils-pa76"></a>Admettons que vous ayez un serveur
<span class="acronym">HTTP</span>, que tous vos fichiers <span class="acronym">HTML</span> soient dans
<tt class="filename">/var/www/html</tt>, qui s'avère aussi être votre
répertoire courant.  Il s'agit de chercher tous les fichiers qui n'ont
pas été modifiés depuis... un mois, par exemple. Les pages
proviennent, incidemment, de différents auteurs : certains
fichiers auront une extension <tt class="filename">html</tt> et d'autres,
l'extension <tt class="filename">htm</tt>. Vous voulez lier ces fichiers
dans le répertoire <tt class="filename">/var/www/obsolete</tt>. Vous
taperez alors<sup>[<a name="id2546316" href="#ftn.id2546316">18</a>]</sup> :</p><p><a name="BId-cmdutils-pa78"></a>
<a name="BId-cmdutils-sc8"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 \
-exec ln {} /var/www/obsolete \;</pre></td></tr></table><p>
</p><p><a name="BId-cmdutils-pa79"></a>D'accord, cette exemple est un peu
compliqué et requiert quelques explications.  Le critère
est :</p><p><a name="BId-cmdutils-pa80"></a>
<a name="BId-cmdutils-sc9"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">\( -name "*.htm" -o -name "*.html" \) -a -ctime -30</pre></td></tr></table><p>
      </p><p><a name="BId-cmdutils-pa81"></a>qui accomplit ce qu'on lui
demande : il recherche tous les fichiers dont le nom se termine
soit par <tt class="filename">.htm</tt>, soit par
<tt class="filename">.html</tt> (<span><b class="command">\( -name "*.htm" -o
-name "*.html" \)</b></span>), <span class="emphasis"><em>et</em></span>
(<span><b class="command">-a</b></span>) qui n'ont pas été modifiés dans les derniers
30 derniers jours, ce qui représente en gros un mois (<span><b class="command">-ctime
-30</b></span>). Notez les parenthèses : elles sont nécessaires
ici, parce que <span><b class="command">-a</b></span> a une priorité plus grande. En
leur absence, tous les fichiers se terminant par
<tt class="filename">.htm</tt> auraient été sortis, plus tous les fichiers
se terminant par <tt class="filename">.html</tt> n'ayant pas été modifiés
depuis un mois, ce qui n'est pas ce que nous voulons. Notez également
que les parenthèses sont désactivées par rapport au
<span class="foreignphrase"><i class="foreignphrase">shell</i></span> : si nous avions mis <span><b class="command">( .. )</b></span> à la
place de <span><b class="command">\( .. \)</b></span>, le <span class="foreignphrase"><i class="foreignphrase">shell</i></span> les aurait
interprétés et aurait tenté d'exécuter <span><b class="command">-name
"*.htm" -o -name "*.html"</b></span> dans un
sous-<span class="foreignphrase"><i class="foreignphrase">shell</i></span>...  Une autre solution aurait été de mettre les
parenthèses entre doubles ou simples apostrophes, mais une barre
oblique inverse (<span class="foreignphrase"><i class="foreignphrase">backslash</i></span>) est
préférable ici dans la mesure où nous ne devons isoler qu'un seul
caractère.</p><p><a name="BId-cmdutils-pa82"></a>Et enfin, la commande doit être
    exécutée pour chacun des fichiers :</p><a name="BId-cmdutils-sc10"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">-exec ln {} /home/httpd/obsolete \;</pre></td></tr></table><p><a name="BId-cmdutils-pa84"></a>Ici aussi, vous devez désactiver le
      <tt class="literal">;</tt> par rapport au <span class="foreignphrase"><i class="foreignphrase">shell</i></span>, car autrement
      le <span class="foreignphrase"><i class="foreignphrase">shell</i></span> l'interprétera comme un séparateur de
      commandes. Si vous ne le faites pas, <span><b class="command">find</b></span> se
      plaindra qu'il manque un argument à
      <tt class="option">-exec</tt>.</p><p><a name="BId-cmdutils-pa85"></a>Un dernier exemple : vous avez un
gros répertoire nommé <tt class="filename">/shared/images</tt>, contenant
toutes sortes d'images. Régulièrement, vous utilisez la commande
<span><b class="command">touch</b></span> pour mettre à jour les dates d'un fichier
nommé <tt class="filename">stamp</tt> dans ce répertoire, de façon à avoir
une référence dans le temps. Vous voulez trouver tous les fichiers
<a name="BId-cmdutils-gt6" href="glossary.html#term-jpeg"><i class="glossterm"><span class="acronym">JPEG</span></i></a>
dans ce répertoire qui sont plus récents que le fichier
<tt class="filename">stamp</tt>, et comme vous avez des images de diverses
sources, ces fichiers ont des extensions <tt class="filename">jpg</tt>,
<tt class="filename">jpeg</tt>, <tt class="filename">JPG</tt> ou
<tt class="filename">JPEG</tt>. Vous voulez aussi éviter de rechercher dans
le répertoire <tt class="filename">old</tt>. Vous voulez vous faire envoyer
la liste de ces fichiers par courrier électronique, et votre nom
d'utilisateur est <b class="userinput"><tt>pierre</tt></b> :</p><p><a name="BId-cmdutils-pa86"></a>
         <a name="BId-cmdutils-sc11"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">find /shared/images -cnewer     \
     /shared/images/stamp       \
     -a -iregex ".*\.jpe?g"     \
     -a -not -regex ".*/old/.*" \
       | mail pierre -s "Nouvelles images"</pre></td></tr></table><p>
      </p><p><a name="BId-cmdutils-pa87"></a>Bien sûr, cette commande n'est pas très
utile si vous devez l'exécuter régulièrement car vous devrez l'entrer
à chaque fois. Il est possible de le faire ainsi :</p><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2546316" href="#id2546316">18</a>] </sup>Notez que cet exemple
requiert que <tt class="filename">/var/www</tt> et
<tt class="filename">/var/www/obsolete</tt> soient sur le même système de
fichier !</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="command-files.html">Précédent</a> </td><td width="20%" align="center"><a accesskey="u" href="cmdutils.html">Niveau supérieur</a></td><td width="40%" align="right"> <a accesskey="n" href="command-sheduling.html">Suivant</a></td></tr><tr><td width="40%" align="left" valign="top">Opérations sur les fichiers et filtres </td><td width="20%" align="center"><a accesskey="h" href="index.html">Sommaire</a></td><td width="40%" align="right" valign="top"> Programmation de démarrage de
	   commandes</td></tr></table></div></body></html>