A menos que seas una persona muy ordenada y tengas los archivos en tu equipo perfectamente clasificados, lo mas normal es que termines buscando. Si, probablemente, como comenté en el artÃculo sobre Catfish, un buscador gráfico para Ubuntu, una de las operaciones mas habituales que realizamos con nuestro equipo es buscar. En este artÃculo, vamos a hacer lo mismo que con Catfish, pero en el terminal. Es decir, vamos a buscar en el terminal.
Para buscar en el terminal utilizaremos find, y es precisamente a esta herramienta a la que vamos a dedicar este artÃculo. Por que, como veremos, no solo nos permite buscar con todo detalle cualquier archivo o directorio. También nos permite realizar acciones con lo que hemos encontrado. Esto, como veremos en el artÃculo, nos va abrir un abanico de posibilidades.
Si embargo, si eres de los que todavÃa no se atreven con el terminal, porque eres relativamente nuevo, o porque simplemente piensas que no es para ti, te recomiendo que pruebes Catfish.
Buscar en el terminal
find o como buscar en el terminal
find es una herramienta disponible para el terminal con el podemos realizar búsquedas en uno o mas directorios de nuestro sistema de archivos. Estas búsquedas las podemos realizar siguiendo diferentes criterios establecidos por nosotros mismos. Y además, con los archivos o directorios encontrados podemos realizar acciones.
Existen diferentes criterios para buscar y localizar archivos y directorios. Desde patrones para buscar por el nombre, hasta rangos de fechas para buscar aquellos archivos que hemos modificado o accedido en el periodo indicado.
find en profundidad
El uso de find es como sigue,
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [punto de inicio] [expresion]
El punto de inicio se refiere a donde vamos a empezar a buscar. AsÃ, por ejemplo si queremos empezar a buscar el directorio en el que nos encontramos, ejecutaremos,
find .
Las opciones -H, -L y -P son las que indicarán a find como tratar con los enlaces simbólicos. En concreto,
-H. Ignora los enlaces simbólicos, excepto aquellos definidos en los argumentos.-L. Sigue los enlaces simbólicos.-P. Ignora los enlaces simbólicos. Este es el comportamiento por defecto.
La opción -D sirve para que find nos informe de lo que sucede. Es útil, en particular para localizar algún problema con la ejecución de la función. AsÃ, tiene algunas opciones adicionales que nos pueden ayudar en esa investigación. Para ver todas las posibilidades, ejecuta find -D help.
La opción -Olevel habilita la optimización de nuestra consulta. De esta manera find reordenará los filtros para acelerar el proceso preservando el funcionamiento esperado.
Condiciones
Las condiciones son todos aquellos requerimientos que debe cumplir un archivo o directorio para que esté dentro de lo que estamos buscando. No voy a citarlos todos, pero si aquellos mas interesantes (al menos para mi),
-name patronselecciona aquellos archivos que cumplen con un determinadopatron. La búsqueda distingue entre mayúsculas y minúsculas. Por supuesto el patrón admite los comodines*,?y[]. Por ejemplo, si tenemos un directorio con los siguientes archivos,
Ejemplo01.txt Ejemplo02.txt Ejemplo03.txt
find . -name "Ejemplo*.txt" nos devolverá todos los archivos.
find . -name "ejemplo*.txt" no nos devolverá nada.
find . -name "Ejemplo0?.txt" nos devolverá todos los archivos.
find . -name "Ejemplo0[1-2].txt" nos devolverá los dos primeros archivos.
-iname patron. Funciona exactamente igual que el anterior, pero es insensible a mayúsculas y minúsculas. Asà por ejemplo en el caso anterior,
find . -iname "ejemplo*.txt" nos devolverá todos los archivos.
-path patron. El funcionamiento es similar al dename, pero para toda la ruta. No solo para el nombre del archivo o el directorio, sino en toda la ruta. Por ejemplo,
find /home/ -path "*/src/*"
Buscará todos los archivos en cuya ruta nos encontremos con /src/.
-ipath patron. Lo mismo que en el caso anterior, pero sin distinguir entre mayúsculas y minúsculas.-type X. El tipo de elemento que estamos buscando. Asà para directorios-type d, para archivos-type fy para enlaces simbólicos-type l. Existen mas tipos, pero estos son los que utilizo.-amin ny-amin +n. Archivos o directorios que tuvieron acceso hacenminutos o al menos hacenminutos.-atime ny-atime +n. Archivos o directorios que tuvieron acceso hacendÃas o al menos hacendÃas.-cmin ny-cmin +n. Archivos o directorios cuyo estado fue modificado hacenminutos o al menos hacenminutos.-ctime ny-ctime +n. Archivos o directorios cuyo estado fue modificado hacendÃas o al menos hacendÃas.-mmin ny-mmin +n. Archivos o directorios que fueron modificados hacenminutos o al menos hacenminutos.-mtime ny-mtime +n. Archivos o directorios que fueron modificados hacendÃas o al menos hacendÃas. Si utilizamos-nos devolverá aquellos archivos o directorios modificados hace menos dendÃas.
+nbusca valores mayor que n
-nbusca valores menor que n
nbusca exactamente el valor n
-perm XXX. Archivos o directorios que tienen exactamente esos permisos.-perm -XXX. Archivos o directorios que tienen al menos esos permisos.-perm /XXX. Archivos o directorios que tienen alguno de esos permisos.-group nombre_del_grupo. Archivos o directorios que pertenecen al gruponombre_del_grupo.-user nombre_del_usuario. Archivos o directorios que pertenecen al usuarionombre_del_usuario.-executable. Archivos que son ejecutables o directorios que son accesibles por el usuario.-readeable. Archivos o directorios para los que el usuario tiene permiso de lectura.-writeable. Archivos o directorios para los que el usuario tiene permiso de escritura.-size n[kMG]o-size +n[kMG]. Archivos que tienen exactamente un tamaño denkKiB,nMMiB onGGiB. O en su segunda forma, que tienen al menos un tamaño de denkKiB (1024 bytes),nMMiB (1024*1024 bytes) onGGiB (1024x1024x1024 bytes).-maxdepth nlimita la profundidad de la búsqueda anniveles.
Acciones
Las acciones definen que es lo que vamos a hacer con los archivos que hemos encontrado según las condiciones establecidas.
-delete. Borra los archivos.-exec orden {} \;. Ejecuta la orden para cada uno de los archivos encontrados.-ls. Lista con el formatols -dils.-fls archivo. Lo mismo que-lspero lo guarda en el archivo indicado.
Operadores
Nos permite concatenar condiciones,
! condicionó `not condicion. Niega la condición establecida.condicion1 condicion2ócondicion1 -a condicion2ócondicion1 -and condicion2. Se deben cumplir ambas condiciones.- condicion1 -o condicion2
ócondicion1 -or condicion2`. Se debe cumplir una de las dos condiciones.
Algunas recetas…
- Buscar en el terminal todos los archivos modificados en la última hora,
find /var/log/ -type f -mmin -60
- Buscar todos los archivos que tengan un tamaño de mas de 50MiB
find ~/Descargas/ -type f -size +50M
- Buscar en el terminal archivos que están en un rango determinado,
find ~/Descargas/ -type f -size +50M -size -100M
- Buscar y borrar todos los archivos que tengan un tamaño de mas de 50MiB
find ~/Descargas/ -type f -size +50M -delete
- Para encontrar archivos vacÃos
find /tmp -type f -empty
- Para encontrar directorios vacÃos,
find /tmp -type d -empty
- Para mover todos los archivos de mas de 1GiB a un directorio
archivos grandes, pero te preguntará en cada ocasión si lo mueve o no, y en función de tu respuesta actuará,
find . -size +1G -ok mv '{}' ~/archivosgrandes \;
- Cambiar el permiso de todos los archivos,
find . -type f -exec chmod 664 {} \;
- Cambiar el permiso de todos los directorios,
find . -type d -exec chmod 775 {} \;
Conclusiones
find de por si ya es una herramienta espectacular para simplemente buscar en el terminal. Pero si además la combinamos con la opción -exec las posibilidades que te ofrece son espectaculares.
Te recomiendo que le des un vistazo, y le dediques algo de tiempo a comprenderla a fondo, porque te va a solucionar mas de un problema. Esta herramienta te permite simplificar las tareas sensiblemente.
Más información,

Me ha parecido un artÃculo muy útil, con tu permiso me lo voy a imprimir para tenerlo de referencia, en mis apuntes no se detalla tanto. Como siempre un trabajo excelente. Gracias.
Muchas gracias VÃctor. La verdad es que llevo algún tiempo persiguiendo escribir este artÃculo, porque últimamente estoy haciendo mucho uso de esta herramienta.
Gracias y un saludo.
Aquà van algunas recetas más…
find /-user 1000 (localiza todos los archivos del primer usuario normal)
find . -type f -perm 0777 -print (buscará en el directorio actual todos los ficheros con permiso 777)
find / -type f ! -perm 777 (buscará todos los ficheros que NO tengan el permiso 777)
find / -perm 2644 (busca todos los ficheros con el bit SGID con permiso 644)
find / -perm 1551 (busca todos los ficheros con el Sticky bit con permiso 551)
find . -type f -name «borrador.txt» -exec rm -f {} ; (busca ese fichero y lo remueve)
find ~ -type f -exec ls -s {} ; | sort -n (lista los ficheros más grandes dentro de todas las carpetas)
find . -name «.*» (buscará ficheros ocultos)
find /dir/ -type f -not -name ‘Protec’ -delete (borra todo lo que hay en el directorio, excepto el fichero llamdo ‘Protec’)