El comando find de #GNU

El comando find del sistema GNU nos servirá para buscar archivos o directorios en nuestros sistemas GNU/Linux

Aunque seamos personas organizadas (no es mi caso) a veces simplemente no encontramos en nuestros sistemas un archivo que recordamos que debería estar en alguna carpeta de nuestro disco duro.

En nuestro entorno de escritorio, quizás existan indexadores de archivos que de manera gráfica nos ayudarán a encontrarlos rápidamente.

Pero si nuestro entorno es la terminal y la línea de comandos, también tendremos herramientas para encontrar un archivo (o carpeta) del que recordamos su nombre, parte de su nombre, que está en una carpeta y lo hemos modificado hace poco, etc.

Esa herramientas en sistemas GNU con kernel Linux son las formadas por findutils de GNU que las componen varias herramientas: find, locate, updatedb, xargs

En este artículo vamos a ver algunas de las opciones que nos ofrece el comando find. Que realiza una búsqueda en un árbol de directorios para encontrar un archivo o grupo de archivos.

Recorre ese árbol de directorios y muestra todas las ocurrencias encontradas de acuerdo a las especificaciones que le haya pasado el usuario. El comando find tiene unas funcionalidades muy potentes de búsqueda.

Este artículo es una adaptación del artículo escrito por Seth Kenlon para la web opensource.com publicado bajo licencia CC-by-sa.

Para este artículo vamos a suponer que tenemos en nuestro /home un directorio llamado Documentos y que dentro, entre otros muchos archivos y carpetas hay 4 archivos llamados: Archivo, archivo, archivoaux.txt y archivo.xml

Encontrar un archivo por el nombre

Puedes localizar un archivo por su nombre de archivo buscando por el nombre completo sin nos acordamos o por una parte del nombre utilizando expresiones regulares.

El comando find necesita la ruta del directorio en el que quieres buscar, las opciones de por qué atributo lo estás buscando (por ejemplo -name buscará por el nombre teniendo en cuenta mayúsculas y minúsculas) y la cadena de búsqueda.

De manera predeterminada, el comando find buscará un nombre de archivo que es exactamente la cadena especificada entre comillas a menos que utilices expresiones regulares.

Vamos a realizar una búsqueda básica de un archivo llamado «archivo» y queremos que busque en nuestro /home/Documentos que también se puede referirse a él como ~/Documentos. Es decir ~ sería similar a /home/tu_usuario/Documentos

Al especificar un $ delante del comando, esto significa que el comando es ejecutado por un usuario sin privilegios de root.

$ find ~/Documentos -name "archivo"
/home/victorhck/Documentos/archivo

Como véis solo encuentra el archivo que coincide con el nombre teniendo en cuenta las mayúsculas y las minúsculas. Es decir encuentra «archivo» pero no «Archivo».

Para no tener en cuenta las mayúsculas y minúsculas en el nombre utilizaremos la opción -iname (insensitive name)

$ find ~/Documentos -iname "archivo"
/home/victorhck/Documentos/archivo
/home/victorhck/Documentos/Archivo

Usando comodines

Pero quizás nos acordamos sólo de parte del nombre, para eso se utilizan los comodines, para que sea reemplazado esa parte del nombre por cualquier letra.

El asterisco * reemplaza cualquier número de caracteres. Un signo de cierre de interrogación reemplaza a un único caracter.

$ find ~/Documentos -iname "archivo*"
/home/victorhck/Documentos/archivo
/home/victorhck/Documentos/Archivo
/home/victorhck/Documentos/archivo.xml
/home/victorhck/Documentos/archivoaux.txt
$ find ~/Documentos -iname "archivo*.???"
/home/victorhck/Documentos/archivo.xml
/home/victorhck/Documentos/archivoaux.txt

Encontrar un archivo modificado en la última semana

Los archivos en los sistemas GNU y Unix almacenan tres «fechas» importantes:

  • La fecha de acceso. Cuando se leyó el archivo por última vez (atime)
  • La fecha de cambio. Cuando se cambió algún atributo (ctime)
  • La fecha de modificación. Cuando se modificó el contenido del archivo (mtime)

Para buscar un archivo que fue modificado en la semana pasada, utiliza la opción -mtime junto con un número (negativo) de días del pasado:

$ find ~/Documentos mtime -7
/home/victorhck/Documentos/archivo
/home/victorhck/Documentos/Archivo
/home/victorhck/Documentos/archivo.xml
/home/victorhck/Documentos/archivoaux.txt

O también podemos combinar ciertas opciones de -mtime para encontrar un archivo modificado dentro de un rango de días.

Podemos buscar un archivo modificado hace un día (indicado con un signo positivo) pero no más de siete días atrás (con un símbolo negativo). Este sería un ejemplo:

$ find ~ -mtime +1 -mtime -7

Buscando por tipo de archivo

Es común optimizar y restringir los resultados de la búsqueda especificando el tipo de archivo que estás buscando. No deberías utilizar esta opción si no estás muy seguro de qué estás buscando.

Pero si sabes que es un archivo, o un directorio, puedes especificar el tipo y así restringir los resultados con la opción –type. Los tipos de búsqueda más comunes son (aunque hay más):

  • d → para directorios
  • f → para archivos
  • l → para enlaces simbólicos

Aquí tienes un ejemplo para buscar dentro de nuestro /home las carpetas que se comience su nombre con Doc:

$ find ~ -type d -name "Doc*"  

Y si queremos que no distinga entre mayúsculas y minúsculas utilizaríamos la opción -iname en vez de -name como hemos visto anteriormente.

Ajustando el alcance del comando

El comando find de manera predeterminada busca de manera recursiva, esto significa que realiza la búsqueda dentro de la ruta especificada, y dentro de los directorios de esa ruta, y dentro de los directorios de los directorios de esa ruta, etc.

Esto puede convertirse en contraproducente según las rutas donde busquemos. Podemos utilizar la opción –maxdepth para decirle al comando en cuantos niveles de sub carpetas queremos queremos que entre.

Por ejemplo vamos a buscar todos los archivos .pdf que tengo en mi equipo y contaremos las ocurrencias pasándole lo encontrado por find al comando wc -l que contará las líneas que haya encontrado find

$ find ~ -name "*pdf" | wc -l 
298

Esto ha buscado todos los archivos PDF en todo mi /home. Ahora ejecutaremos lo mismo, pero diciéndole que solo entre a buscar en dos niveles de subcarpetas. Lo que reduce el número de archivos encontrados.

$ find ~ -maxdepth 2 -name "*pdf" | wc -l
42

También existe la opción de indicar el número mínimo de niveles de subcarpetas en los que debe buscar el comando find con la opción –mindepth

Más opciones de búsqueda del comando find

Pero además de todo lo visto, este comando tiene muchas más opciones a la hora de realizar búsquedas, veremos algunas:

  • -perm → realizará una búsqueda de archivos que coincidan con unos permisos determinados
  • -empty → una opción muy interesante es buscar archivo o carpetas que estén vacías
  • -user → podremos buscar archivos que pertenezcan a un usuario determinado del sistema.
  • -size → otra opción interesante es buscar archivos o carpetas que sean de un tamaño especificado.
  • -exec <comando> → añadiendo esta opción podremos ejecutar el <comando> que queramos a los resultados de la búsqueda efectuada (podremos buscar con grep, cambiarles permisos con chmod, borrarlos con rm, etc)

Y esto sería un uso básico explicado del comando find. Además de las fuentes habituales de información sobre un comando con las páginas man o info te recomiendo un artículo del gran David aka «ochobitshacenunbyte»:

Un verdadero hacker de GNU/Linux que en su artículo muestran muchos ejemplos prácticos. No como yo, que soy un simple aprendiz!! 🙂

6 comentarios sobre “El comando find de #GNU

  1. El parámetro que siempre he usado con find es -name con la inclusión de * si hace falta (desconocía el -iname pero veo más útil lo primero que he dicho, para mi).

    Los -*time y el -maxdepth los desconocía en absoluto. Me parecen muy útiles.

    Y ya los parámetros adicionales… no creo que los use nunca (ni me acuerde de ellos).

    Acabo de mirar el man y es larguísimo en opciones. Menos mal que no las pusistes todas. 8-P

      1. Si es interesante el título me leo el artículo entero. Y claro, todos acaban en:

        «¿Te ha resultado interesante? ¿Ya lo conocías y lo usabas? ¿Has descubierto algo nuevo con este comando? Utiliza los comentarios del blog para compartir tu opinión y así saber si te resultan interesantes estos artículos.»

        Te habrás fijado que en TW, FSF y alguna cosa más no digo ni mú.

        Todo esto desde que falta forosuse y te añadí en una pestaña que tengo siempre abierta en Firefox (y un marcador en mi sección Linux, claro).

Me gustaría saber tu opinión. Deja un comentario (Puedes usar MarkDown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.