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!! 🙂

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
No… Todos serían laaarguisimo!
Cuantos comentarios por tu parte últimamente…
Ssldudo
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).
Gracias!👍
Estamos con lo del foro, aunque no lo parezca…
A ver si pronto hay noticias…
Saludos
¡Excelente información, muchas gracias por estas series tan informativas de artículos sobre comandos!.
De nada.
El artículo de David es también muy bueno para consultar ..
Saludos