<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>find: Busca archivos en función de ciertos criterios</title><meta name="generator" content="DocBook XSL Stylesheets V1.64.0"><link rel="home" href="index.html" title="Guía de Referencia"><link rel="up" href="cmdutils.html" title="Capítulo 5. Los utilitarios de la línea de comandos"><link rel="previous" href="command-files.html" title="Operaciones y filtrado de archivos"><link rel="next" href="command-sheduling.html" title="Programar la ejecución de comandos"></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: Busca archivos en función de ciertos criterios</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="command-files.html">Anterior</a> </td><th width="60%" align="center">Capítulo 5. Los utilitarios de la línea de comandos</th><td width="20%" align="right"> <a accesskey="n" href="command-sheduling.html">Siguiente</a></td></tr></table><hr></div><div class="sect1" lang="es"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="command-find"></a>find: Busca archivos en función de ciertos criterios</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> es un utilitario de <span class="application">UNIX</span> muy antiguo. Su rol es recorrer recursivamente uno o más directorios y encontrar archivos que se correspondan con un cierto conjunto de criterios en esos directorios. Aunque es muy útil, su sintaxis es verdaderamente arcana, y usarlo requiere cierta práctica. La sintaxis general es: <a name="BId-cmdutils-sc6"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">find [opciones] [directorios] [criterio] [acción]</pre></td></tr></table><p> Si no especifica directorio alguno, <span><b class="command">find</b></span> buscará en el directorio corriente. Si no especifica el criterio, esto es equivalente a “<span class="quote">verdadero</span>”, por lo que se encontrarán todos los archivos. Las opciones, criterios y acciones son tan numerosas que solo mencionaremos algunas de cada una. Comencemos por las opciones:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-cmdutils-pa51"></a> <tt class="option">-xdev</tt>: No extender la búsqueda a los directorios ubicados en otros sistemas de archivos.</p></li><li><p><a name="BId-cmdutils-pa52"></a><tt class="option">-mindepth <n></tt>: Descender al menos <tt class="option"><n></tt> niveles bajo el directorio especificado antes de comenzar a buscar los archivos.</p></li><li><p><a name="BId-cmdutils-pa53"></a><tt class="option">-maxdepth <n></tt>: Buscar los archivos que se encuentran a lo sumo <tt class="literal">n</tt> niveles bajo el directorio especificado.</p></li><li><p><a name="BId-cmdutils-pa54"></a><tt class="option">-follow</tt>: Seguir los vínculos simbólicos si apuntan a directorios. Predeterminadamente, <span><b class="command">find</b></span> no los sigue.</p></li><li><p><a name="BId-cmdutils-pa55"></a><tt class="option">-daystart</tt>: Cuando se usan las pruebas relativas a la fecha y la hora (ver debajo), toma el comienzo del día corriente como etiqueta temporal en vez del predeterminado (24 horas antes de la hora corriente).</p></li></ul></div><p><a name="BId-cmdutils-pa56"></a>Un criterio puede ser una o más de varias pruebas <a name="BId-cmdutils-gt1" href="glossary.html#term-atomic"><i class="glossterm">atómicas</i></a>; algunas pruebas útiles son:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-cmdutils-pa57"></a><tt class="option">-type <tipo></tt>: Busca los archivos de un tipo dado; <tt class="option"><tipo></tt> puede ser uno de: <tt class="literal">f</tt> (archivo regular), <tt class="literal">d</tt> (directorio), <tt class="literal">l</tt> (vínculo simbólico), <tt class="literal">s</tt> (<span class="foreignphrase"><i class="foreignphrase">socket</i></span>), <tt class="literal">b</tt> (archivo en modo de bloques), <tt class="literal">c</tt> (archivo en modo caracter) o <tt class="literal">p</tt> (tubería nombrada).</p></li><li><p><a name="BId-cmdutils-pa58"></a><tt class="option">-name <patrón></tt>: Encontrar los archivos cuyo nombre se corresponde con el <tt class="option"><patrón></tt> dado. Con esta opción, se trata a <tt class="option"><patrón></tt> como un <i class="glossterm"><a name="BId-cmdutils-gt2"></a>patrón de englobamiento</i> del shell (consulte <a href="glob-regex.html" title="Patrones de englobamiento del shell">“Patrones de englobamiento del shell”</a>).</p></li><li><p><a name="BId-cmdutils-pa59"></a><tt class="option">-iname <patrón></tt>: Como <tt class="option">-name</tt>, pero sin tener en cuenta la capitalización.</p></li><li><p><a name="BId-cmdutils-pa60"></a><tt class="option">-atime <n></tt>, <tt class="option">-amin <n></tt>: Encontrar los archivos a los que se ha accedido por última vez hace <tt class="option"><n></tt> días (<tt class="option">-atime</tt>) o hace <tt class="option"><n></tt> minutos (<tt class="option">-amin</tt>). También puede especificar <tt class="option">+<n></tt> o <tt class="option">-<n></tt>, en cuyo caso la búsqueda se hará para los archivos accedidos respectivamente hace al menos o a lo sumo <tt class="option"><n></tt> días/minutos.</p></li><li><p><a name="BId-cmdutils-pa61"></a><tt class="option">-anewer <archivo></tt>: Encontrar los archivos que han sido accedidos más recientemente que el archivo <tt class="option"><archivo></tt>.</p></li><li><p><a name="BId-cmdutils-pa62"></a><tt class="option">-ctime <n></tt>, <tt class="option">-cmin <n></tt>, <tt class="option">-cnewer <archivo></tt> Igual que para <tt class="option">-atime</tt>, <tt class="option">-amin</tt> y <tt class="option">-anewer</tt>, pero se aplica a la última fecha en la cual se modificó el contenido del archivo.</p></li><li><p><a name="BId-cmdutils-pa63"></a><tt class="option">-regex <patrón></tt>: Como <tt class="option">-name</tt>, pero <tt class="literal">patrón</tt> se trata como una <i class="glossterm"><a name="BId-cmdutils-gt3"></a>expresión regular</i>.</p></li><li><p><a name="BId-cmdutils-pa64"></a><tt class="option">-iregex <patrón></tt>: Como <tt class="option">-regex</tt>, pero sin distinguir entre mayúsculas y minúsculas.</p></li></ul></div><p><a name="BId-cmdutils-pa65"></a>Existen muchas otras pruebas, debe consultar <span class="citerefentry"><span class="refentrytitle"><a name="BId-cmdutils-rt1"></a>find</span>(1)</span> para más detalles. Para combinar las pruebas, Usted puede utilizar uno de:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-cmdutils-pa66"></a><tt class="option"><c1> -a <c2></tt>: Verdadero si tanto <tt class="option"><c1></tt> como <tt class="option"><c2></tt> son verdaderas; <tt class="option">-a</tt> está implícito, por lo tanto puede ingresar <tt class="option"><c1> <c2> <c3></tt> ... si quiere que todas las pruebas <tt class="option"><c1></tt>, <tt class="option"><c2></tt>, ... sean verdaderas.</p></li><li><p><a name="BId-cmdutils-pa67"></a><tt class="option"><c1> -o <c2></tt>: Verdadero si <tt class="option"><c1></tt> o <tt class="option"><c2></tt> o ambos son verdaderos. Note que <tt class="option">-o</tt> tiene una <a name="BId-cmdutils-gt4" href="glossary.html#term-precedence"><i class="glossterm">precedencia</i></a> menor que <tt class="option">-a</tt>, por lo tanto si desea, por ejemplo, los archivos que verifican los criterios <tt class="option"><c1></tt> o <tt class="option"><c2></tt> y verifican el criterio <tt class="option"><c3></tt>, tendrá que usar paréntesis y escribir <tt class="option">( <c1> -o <c2> ) -a <c3></tt>. Debe <a name="BId-cmdutils-gt5" href="glossary.html#term-escape"><i class="glossterm">escapar</i></a> (desactivar) los paréntesis, ya que si no lo hace ¡el shell los interpretará!</p></li><li><p><a name="BId-cmdutils-pa68"></a><tt class="option">-not <c1></tt>: Invertir la prueba <tt class="option"><c1></tt>, por lo tanto <tt class="option">-not <c1></tt> es verdadero si <tt class="option"><c1></tt> es falso.</p></li></ul></div><p><a name="BId-cmdutils-pa69"></a>Finalmente, puede especificar una acción para cada archivo encontrado. Las acciones más usadas frecuentemente son:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-cmdutils-pa70"></a><tt class="option">-print</tt>: Simplemente imprime el nombre de cada archivo en la salida estándar. Esta es la acción predeterminada.</p></li><li><p><a name="BId-cmdutils-pa71"></a><tt class="option">-ls</tt>: Imprime en la salida estándar el equivalente de <span><b class="command">ls -ilds</b></span> para cada archivo que encuentra.</p></li><li><p><a name="BId-cmdutils-pa72"></a><tt class="option">-exec <comando></tt>: Ejecutar el comando <tt class="option"><comando></tt> sobre cada archivo encontrado. La línea de comandos <tt class="option"><comando></tt> debe terminar con un <tt class="literal">;</tt>, que deberá desactivar para que el shell no lo interprete; la posición del archivo se representa con <tt class="literal">{}</tt>. Vea los ejemplos de uso para entender mejor esto.</p></li><li><p><a name="BId-cmdutils-pa73"></a><tt class="option">-ok <comando></tt>: Igual que <tt class="option">-exec</tt> pero pedir confirmación para cada comando.</p></li></ul></div><p><a name="BId-cmdutils-pa74"></a>¿Todavía está aquí? Está bien, ahora practiquemos un poco, ya que todavía es la mejor forma de entender a este monstruo. Digamos que quiere encontrar todos los directorios en <tt class="filename">/usr/share</tt>. Entonces ingresará:</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><a name="BId-cmdutils-pa76"></a>Suponga que tiene un servidor <span class="acronym">HTTP</span>, todos sus archivos <span class="acronym">HTML</span> están en <tt class="filename">/var/www/html</tt>, que coincide con su directorio corriente. Usted desea encontrar todos los archivos que no se modificaron en el último mes. Debido a que tiene páginas de varios autores, algunos archivos tienen la extensión <tt class="filename">html</tt> y otros la extensión <tt class="filename">htm</tt>. Desea vincular estos archivos en el directorio <tt class="filename">/var/www/obsolete</tt>. Entonces ingresará<sup>[<a name="id2546050" href="#ftn.id2546050">19</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><a name="BId-cmdutils-pa79"></a>Está bien, este es uno un poco complejo y requiere una pequeña explicación. El criterio es este:</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><a name="BId-cmdutils-pa81"></a>que hace lo que queremos: encuentra todos los archivos cuyos nombres terminan con <tt class="filename">.htm</tt> o con <tt class="filename">.html</tt> “<span class="quote"><tt class="literal">\( -name "*.htm" -o -name "*.html" \)</tt></span>”, <span class="emphasis"><em>y</em></span> (<tt class="literal">-a</tt>) que no han sido modificados en los últimos 30 días, lo que es más o menos un mes (<tt class="literal">-ctime -30</tt>) Note los paréntesis: aquí son necesarios, porque <tt class="literal">-a</tt> tiene una precedencia mayor. Si no hubiera paréntesis alguno, se hubieran encontrado todos los archivos que terminen con <tt class="filename">.htm</tt>, y todos los archivos que terminen con <tt class="filename">.html</tt> y que no han sido modificados por un mes, que no es lo que nosotros queremos. Note también que los paréntesis están desactivados para el shell: si hubiésemos puesto <tt class="literal">( .. )</tt> en vez de <tt class="literal">\( .. \)</tt>, el shell los hubiese interpretado y tratado de ejecutar <tt class="literal">-name "*.htm" -o -name "*.html"</tt> en un sub-shell... Otra solución podría haber sido poner los paréntesis entre comillas simples o dobles, pero aquí es preferible una contrabarra ya que simplemente tenemos que aislar un caracter solo.</p><p><a name="BId-cmdutils-pa82"></a>Y finalmente, está el comando a ejecutar para cada uno de los archivos:</p><a name="BId-cmdutils-sc10"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">-exec ln {} /var/www/obsolete \;</pre></td></tr></table><p><a name="BId-cmdutils-pa84"></a>Aquí también, tiene que desactivar el <tt class="literal">;</tt> para el shell, ya que de no ser así el shell lo interpretaría como un separador de comandos. Si no lo hace, <span><b class="command">find</b></span> se quejará de que le falta un argumento a <tt class="option">-exec</tt>.</p><p><a name="BId-cmdutils-pa85"></a>Un último ejemplo: tiene un directorio enorme denominado <tt class="filename">/shared/images</tt>, con todo tipo de imágenes en él. Regularmente, Usted usa el comando <span class="application">touch</span> para actualizar la fecha de un archivo denominado <tt class="filename">stamp</tt> en este directorio, para que tenga una referencia temporal. Usted quiere encontrar todas las imágenes <a name="BId-cmdutils-gt6" href="glossary.html#term-jpeg"><i class="glossterm"><span class="acronym">JPEG</span></i></a> en el mismo que son más nuevas que el archivo <tt class="filename">stamp</tt>, y ya que Usted obtuvo las imágenes de varias fuentes, estos archivos tienen las extensiones <tt class="filename">jpg</tt>, <tt class="filename">jpeg</tt>, <tt class="filename">JPG</tt> o <tt class="filename">JPEG</tt>. También quiere evitar buscar en el directorio <tt class="filename">old</tt>. Quiere que se le envíe la lista de estos archivos por correo electrónico, y su nombre de usuario es <b class="userinput"><tt>peter</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 peter -s "Imágenes nuevas" </pre></td></tr></table><p> </p><p><a name="BId-cmdutils-pa87"></a>Por supuesto, este comando no es muy útil si tiene que ingresarlo cada vez, y quisiera ejecutarlo regularmente... Puede hacer lo siguiente:</p><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2546050" href="#id2546050">19</a>] </sup>Note que este ejemplo necesita que <tt class="filename">/var/www</tt> y <tt class="filename">/var/www/obsolete</tt> ¡estén en el mismo sistema de archivos!</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">Anterior</a> </td><td width="20%" align="center"><a accesskey="u" href="cmdutils.html">Subir</a></td><td width="40%" align="right"> <a accesskey="n" href="command-sheduling.html">Siguiente</a></td></tr><tr><td width="40%" align="left" valign="top">Operaciones y filtrado de archivos </td><td width="20%" align="center"><a accesskey="h" href="index.html">Inicio</a></td><td width="40%" align="right" valign="top"> Programar la ejecución de comandos</td></tr></table></div></body></html>