# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

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.

Categoría: Comandos, Unix | Etiquetas: , ,

11 Comentarios

  1. CHRISTIANUX VIDALINUX dice:

    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

  2. Sergio dice:

    Me gustaria saber que sintaxis debo aplicar para buscar archivos que contengan la cadena [algo]. Por ejemplo prueba[uno].txt
    Gracias.

  3. Alex dice:

    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

  4. Federico dice:

    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

  5. botto dice:

    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]

  6. Guido ayala dice:

    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

  7. lucas dice:

    buenas.
    quiero buscar archivos de cierta extensión digamos .mp3
    alguna idea?

  8. Walter dice:

    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

Deja una respuesta