ago 3, 2008
El comando Unix Find
El programa find es un comando común en sistemas Unix que se utiliza para encontrar archivos en un determinado directorio a partir de diversas reglas de búsqueda, tales como nombre exacto de archivo, fecha de creación, tamaño, permisos, etc, llegando a ser muy flexible y una de las herramientas más útiles en la administración de sistemas cuando se sabe utilizar.
La sintaxis de find más básica es la siguiente:
find [ruta-de-acceso...] [expresión]
La ruta de acceso por defecto es el directorio actual; la expresión por defecto es -print, pudiendo ser operadores, opciones, pruebas y acciones:
operadores (prioridad decreciente; se supone -and si no hay otros):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
opciones posicionales (siempre verdaderas): -daystart -follow -regextype
opciones normales (siempre verdaderas, especificadas antes de otras expresiones):
-depth --help -maxdepth NIVELES -mindepth NIVELES -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race
prueba (N puede ser +N or -N o N): -amin N -anewer ARCHIVO -ctime N -empty -false
-cnewer ARCHIVO -ctime N -empty -false -fstype TIPO -gid N -group NOMBRE
-ilname PATRON -iname PATRON -inum N -iwholename PATRON -iregex PATRON
-links N -lname PATRON -mmin N -mtime N -name PATRON -newer ARCHIVO
-nouser -nogroup -path EXPR-REG -perm [+-]MODO -regex EXPR-REG
-wholename EXPR-REG -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NOMBRE -xtype [bcdpfls]
acciones: -delete -print0 -printf FORMATO -fprintf ARCHIVO FORMATO -print
-fprint0 ARCHIVO -fprint ARCHIVO -ls -fls ARCHIVO -prune -quit
-exec COMANDO ; -exec COMANDO {} + -ok COMANDO ;
-execdir COMANDO ; -execdir COMANDO {} + -okdir COMANDO ;
Veamos unos ejemplos prácticos para llegar a comprender la potencia de este comando:
Queremos encontrar todos los ficheros con extension .conf dentro de /etc:
find /etc -name '*.conf'
Lo cierto es que este tipo de búsquedas pueden resultar demasiado grandes, y listar muchísmos resultados, para ello podemos añadir criterios y acotar los resultados. Si por ejemplo quisieramos ver los logs ubicados dentro de /usr/local cuyo tamaño supere los 100Mb:
find /usr/local/ -name '*log' -a -size +100M
Y si quiseramos saber que ficheros de el directorio /var/log/ cuya extensión sea .bak no han sido modificados en 15 días:
find /var/log -name '*.bak' -mtime +15
Si no quisieramos esos ficheros, solamente tenemos que borrarlos:
find /var/log -name '*.bak' -mtime +15 -exec rm -f {} \;
La verdad es que la mayor parte de expresiones de find son bastante intuitivas, -mtime, -uid, -name, -size, etc. Pero es realmente interesante comentar “-exec”, pues nos va a ser de extrema utilidad para construir comandos potentes con find.
-exec nos va a permitir aplicar ciertas acciones a los ficheros encontrados con find, como en el ejemplo anterior, en el cual eliminabamos los ficheros que coincidian con ciertos criterios. Para ello tenemos que comprender el uso de ‘{}’ y \;
‘{}’ será cada uno de los ficheros encontrados, y \; indicará donde termina la ejecución del exec.
Como podéis ver las posibilidades de este comando (como las de la mayoría de comandos unix) son infinitas, solamente hay que comprenderlo y saber en que momento puede sernos de utilidad. Realmente podemos ejecutar operaciones tediosas con una sola línea de código. Recordad que en las páginas man teneis muchísima más información.

ME GUSTARIA SABER Q SINTAXIS APLICAR PARA USAR FIND BUSCANDO UN ARCHIVO SI SOLO SE QUE LA PRIMERA LETRA DEL NOMBRE DEL ARCHIVO ES A o B…GRACIAS
find . -name a* -o -name b* -type f
Saludos
Me gustaria saber que sintaxis debo aplicar para buscar archivos que contengan la cadena [algo]. Por ejemplo prueba[uno].txt
Gracias.
Hola Sergio,
No entiendo muy bien que necesitas. Si únicamente necesitas buscar ficheros que contienen una cadena de texto determinada sería:
find . -name \*cadena* -type f
Hola….estoy haciendo un script que entre otras cosas busca informacion mayor a n dias en ciertos directorios y lo elimina. Me ha funcionado bien para el caso en que los directorios a depurar solo tengan archivos, pero el rm termina mal si debe depurar directorios dentro de directorios, aunque el borrado finalmente lo hace. El error es que al final quiere hacer un chdir al directorio borrado…se puede ejecutar de alguna forma para que no termine con error?
Ejemplo: quiero depurar el contenido del directorio /usr/prueba/log
A su vez, el directorio log contiene sub directorios con formato de fecha, uno por cada dia…por ejemplo /usr/prueba/log/2010-05-06
el comando que ejecuto es:
find /usr/prueba/log +mtime 7 -exec rm -f -r {} \;
El mensaje que sale es el siguiente:
find: cannot chdir to : No such file or directory
Pero el directorio es borrado…..podria evitar el mensaje para que el RC sea 0 ? Gracias
para buscar archivos segun su contenido se usa la orden grep, no find, find busca archivos evaluando sus atributos.
grep “algo” [archivo donde quieras buscar]
Hola estoy buscando como realizar un borrado de archivos con FECHA DE CREACION 90 dias a la actual y un comando para ubuntu que me permita localizar solo los archivos creados la fecha actual menos 90 dias gracias
Puedes hacerlo sin problemas con find, usando los parámetros “mtime” y “exec”. Lo tienes en el propio artículo
Saludos
buenas.
quiero buscar archivos de cierta extensión digamos .mp3
alguna idea?
find . -type f -name *mp3
Si quiero comprimir los archivos mayores a 20 dias, pero no quiero que en el listado aparezcan los que ya tienen extension .gz o .Z