# rm-rf.es

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.

Wikipedia

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 ‘{}’\;

‘{}’ 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.

Salir de la versión móvil