Cómo buscar con el comando find en Linux con ejemplos
Te cuento cómo utilizar el comando “find” para buscar cualquier fichero o directorio en Linux con algunos ejemplos de uso de esta potentísima herramienta. Te explicaré todas las opciones principales que puedes utilizar.
Si quieres tener un Linux instalado en tu equipo donde probar todos estos comandos, te recomiendo que hagas el curso de Linux básico donde te enseño paso a paso cómo instalar Debian en una máquina virtual de VirtualBox.
En primer lugar vamos a ver qué nos dice Linux cuando le preguntamos por el comando find
FIND(1) General Commands Manual FIND(1)
NAME
find - search for files in a directory hierarchy
Perfecto, con esto nos dice que es un comando para buscar fichero en un directorio jerárquicamente.
Índice de contenidos
Estructura del comando
El comando tiene una estructura determinada a la hora de ser ejecutado hay indicarle una serie de opciones como el directorio donde debe buscar, el nombre del fichero que se desea buscar y otras opciones menos generales. Un ejemplo de estas opciones pueden ser el filtrado por fechas de creación, de modificación al fichero etc..
La estructura del comando es la siguiente:
find <directorio> <opciones>
<termino de búsqueda>
El directorio es donde debe empezar la búsqueda, las opciones son muy variadas y las más importantes las veremos en los ejemplos que os muestro a continuación. Y por último está el término de búsqueda que deberá coincidir con el nombre del fichero que estamos buscando.
Crear el árbol de directorios de ejemplo
Ahora vamos a poner unos ejemplos para buscar ficheros en un árbol de directorios que creamos de esta forma:
jaime@aprendolinux:~$ mkdir -p dir1/dir1-{1..4}
jaime@aprendolinux:~$ touch dir1/fichero-{1..4}
jaime@aprendolinux:~$ touch dir1/dir1-{1..4}/fichero-{1..3}
jaime@aprendolinux:~$ ls dir1/
dir1-1 dir1-2 dir1-3 dir1-4 fichero-1 fichero-2 fichero-3 fichero-4
jaime@aprendolinux:~$ ls dir1/dir1-*
dir1/dir1-1:
fichero-1 fichero-2 fichero-3
dir1/dir1-2:
fichero-1 fichero-2 fichero-3
dir1/dir1-3:
fichero-1 fichero-2 fichero-3
dir1/dir1-4:
fichero-1 fichero-2 fichero-3
Genial, ya tenemos nuestro arbol de directorios creado con varios ficheros dentro de cada uno de los directorios.
Cómo buscar un fichero con find en Linux
Ahora queremos buscar en el directorio “dir1” todos los ficheros que coincidan en el nombre con “fichero-3”, para ello es tan fácil como lanzar el siguiente comando:
jaime@aprendolinux:~$ find dir1 -name 'fichero-3'
dir1/dir1-4/fichero-3
dir1/dir1-3/fichero-3
dir1/dir1-2/fichero-3
dir1/dir1-1/fichero-3
dir1/fichero-3
jaime@aprendolinux:~$ find dir1 -name '*ichero-3'
dir1/dir1-4/fichero-3
dir1/dir1-3/fichero-3
dir1/dir1-2/fichero-3
dir1/dir1-1/fichero-3
dir1/fichero-3
Como ves se puede utilizar también el simbolo “*” para buscar encontrar ficheros de los que no recuerdes alguna parte del nombre.
Ejemplos cómo buscar con find no sensible a mayúsculas y minúsculas
Si por el contrario, no quieres que la búsqueda sea sensible a las mayúsculas, puedes utilizar la opción “iname” para buscar el término.
jaime@aprendolinux:~$ find dir1 -iname 'Fichero-3'
dir1/dir1-4/fichero-3
dir1/dir1-3/fichero-3
dir1/dir1-2/fichero-3
dir1/dir1-1/fichero-3
dir1/fichero-3
Comando find para búsqueda inversa
Otra opción que podemos usar es la búsqueda contraria o inversa de un termino, por ejemplo si queremos obtener todos los ficheros y directorios que no tengan en su nombre el término “fichero-3”:
jaime@aprendolinux:~$ find dir1/ -not -name 'fichero-3'
dir1/
dir1/dir1-4
dir1/dir1-4/fichero-1
dir1/dir1-4/fichero-2
dir1/dir1-3
dir1/dir1-3/fichero-1
dir1/dir1-3/fichero-2
dir1/dir1-2
dir1/dir1-2/fichero-1
dir1/dir1-2/fichero-2
dir1/fichero-1
dir1/fichero-4
dir1/dir1-1
dir1/dir1-1/fichero-1
dir1/dir1-1/fichero-2
dir1/fichero-2
Comando find con fecha de modificación o acceso
Ahora verás unos ejemplos para buscar un fichero con find. Podrás filtrar por los creados, modificados o accedidos en un número de minutos, horas o días. Éstas son las opciones:
- “-atime” Fecha de último acceso – Fecha más reciente en que el archivo fue leído o escrito.
- “-mtime” Fecha de modificación – Fecha más reciente en que se modificó el archivo.
- “-ctime” Fecha del cambio de metadatos – Fecha más reciente en que se actualizaron los metadatos del archivo.
Así por ejemplo, para poder acceder a un fichero con una fecha diferente al resto realizamos este cambio en el ejemplo que estamos usando. Así la fecha de modificación del “fichero-1” será diferente al resto:
jaime@aprendolinux:~$ cd dir1/
jaime@aprendolinux:~/dir1$ ls
dir1-1 dir1-2 dir1-3 dir1-4 fichero-1 fichero-2 fichero-3 fichero-4
jaime@aprendolinux:~/dir1$ touch fichero-1
jaime@aprendolinux:~/dir1$ ls -alst
total 24
0 -rw-r--r-- 1 jaime jaime 0 may 10 23:17 fichero-1
4 drwxr-xr-x 2 jaime jaime 4096 may 10 22:47 dir1-1
4 drwxr-xr-x 2 jaime jaime 4096 may 10 22:47 dir1-2
4 drwxr-xr-x 2 jaime jaime 4096 may 10 22:47 dir1-3
4 drwxr-xr-x 2 jaime jaime 4096 may 10 22:47 dir1-4
4 drwxr-xr-x 6 jaime jaime 4096 may 10 22:47 .
0 -rw-r--r-- 1 jaime jaime 0 may 10 22:47 fichero-2
0 -rw-r--r-- 1 jaime jaime 0 may 10 22:47 fichero-3
0 -rw-r--r-- 1 jaime jaime 0 may 10 22:47 fichero-4
Perfecto, ¿y si queremos buscar los fichero que han sido modificados en el último minuto? Deberemos usar la opción “-mmin” y le decimos que sea en menos de 1 minuto “-1”.
jaime@aprendolinux:~$ find dir1/ -mmin -1
dir1/fichero-1
Borrar un fichero encontrado con comando find
Si lo que buscas es que un fichero que coincida con una busqueda del comando find sea borrado, tenemos dos opciones de hacerlo. Con la opción “-delete” (que no tienen todas las versiones de este comando) y la opción “-exec rm”.
A continuación veremos como funciona cada una de las opciones, empezando por “delete”.
jaime@aprendolinux:~$ find dir1/ -name 'fichero-4'
dir1/fichero-4
jaime@aprendolinux:~$ find dir1/ -name 'fichero-4' -delete
jaime@aprendolinux:~$ find dir1/ -name 'fichero-4'
jaime@aprendolinux:~$
Genial, ya puedes ver que hemos eliminado “fichero-4” de dir1 y ya no aparece más en la última búsqueda.
Ahora vamos a ver el ejemplo de la opción “exec rm” y además le añadiremos la opción “-print” para saber lo que encuentra y lo que va a borrar en este caso:
jaime@aprendolinux:~$ find dir1/ -name 'fichero-2'
dir1/dir1-4/fichero-2
dir1/dir1-3/fichero-2
dir1/dir1-2/fichero-2
dir1/dir1-1/fichero-2
dir1/fichero-2
jaime@aprendolinux:~$ find dir1/ -name 'fichero-2' -print -exec rm {} \;
dir1/dir1-4/fichero-2
dir1/dir1-3/fichero-2
dir1/dir1-2/fichero-2
dir1/dir1-1/fichero-2
dir1/fichero-2
jaime@aprendolinux:~$ find dir1/ -name 'fichero-2'
jaime@aprendolinux:~$
Si quieres saber la diferencia entre utilizar “delete” o usar “exec rm”, realmente no la hay. Como te dije antes, “delete” no existe en todas las versiones del comando “find”. Por eso es más común encontrar los ejemplos con “exec rm”.