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.