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.

28 comentarios en “El comando Unix Find

  1. 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. Me gustaria saber que sintaxis debo aplicar para buscar archivos que contengan la cadena [algo]. Por ejemplo prueba[uno].txt
    Gracias.

  3. 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. 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. 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. 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. 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

  8. Hola buenas…
    Necesito hacer un tar y luego comprimnir el tar de todos los ficheros que sean mas antiguos de la fecha 01/01/2010.
    Como lo puedo hacer?
    Tengo que contar los días desde esa fecha a la fecha actual o el find tiene alguna opción que me ayude.

  9. El find solo funciona si solo tienes una cantidad limitada de archivos, es decir, si la cantidad de archivos producto del argumento del comando -name es menor que 300 aprox, sino se cae con el error :

    0403-027 The parameter list is too long.

    como lo puedes solucionar..

  10. Hola necesito buscar un archivo o texto pero no se la ubicacion del directorio. Existe alguna forma de ubicar en cualquier directorio
    Gracias
    Jaime

  11. Hola,

    necesito un comando que me permita buscar el archivo más reciente, según la fecha del nombre del archivo. (no del sistema) por ejemplo.
    hola201001.txt.gz
    hola201101.txt.gz
    hola201201.txt.gz — > este ultimo seria el de la fecha mas reciente.

    Gracias.
    Josa

  12. Hola,

    Para realizar el depurador de un dir necesito ejecutar luego del find un mv utilizando los subdir que me trae el find pero agregando una nueva ruta delante. Como podría utilizarlo?

    Ej:

    find . -name ‘*.txt’ [ESTO ME TRAE]
    ./subdir1/prueba8.txt
    ./subdir5/prueba.txt
    ./subdir23/prueba3.txt

    [NECESITO EJECUTAR]

    mv ./subdir1/*.txt /archivados/subdir1/*.txt
    mv ./subdir5/*.txt /archivados/subdir5/*.txt
    mv ./subdir23/*txt /archivados/subdir23/*txt

    Muchas gracias
    Roja

  13. Buenas necesito ejecutar un comando para esto:
    Liste por pantalla todos los archivos que se encuentren a partir del directorio /home y que comiencen por los caracteres arch y sean de 5 letras.
    Ejecuto:
    ls | find /home -name ‘arch?’
    No me devuelve nada

  14. Salvaguardar los ficheros regulares y no vacíos que sean de usuarios con identificador de usuario e identificador de grupo comprendidos entre 500 y 599, ambos inclusive y que se omita en la búsqueda el directorio /dev

    Un saludo.

  15. Si quisiera coger el tamaño del directorio y de sus subdirectorios a la vez, es decir, que no los interprete uno a uno, sino que si tengo

    /home = 1 MB
    /home/1 = 800 MB
    /home/2 = 100 MB

    Que al hacer el comando me dé 901 MB y no 1 MB

  16. Saludos estimados.

    Tengo unos 3 TB de archivos que han sido renombrados con la extención
    “.vvv” ahora bien: Necesito “No eliminar” sino quitar dicha extencion.

    Actualmente los archivos estan asi:

    nombre_de_archivo.xls.vvv | nombre_de_archivo_2.pdf.vvv

    Con el comando ( rename ‘s/\.vvv$//’ *.vvv ) puedo quitar dichas extenciones
    pero solo dentro de un directorio especifico, y resulta que dentro de estos
    3TB de informacion, existen miles y miles de subcarpetas.

    La gran pregunta es: Como creo un script o elaboro una sintaxis donde
    el comando “find” me busque esta extención dentro de cada disco duro
    y la elimine solo el “.vvv” sin importar su ubicación?

  17. Muy buena las respuestas, tienes bastante paciencia para contestar cosas, casi triviales, que basta con probar el comando. muchas gracias con el primer ejemplo que entregas del comando find me soluciono el problema de lo que quería hacer. Sin embargo debo practicar cual es el alcance de la opción -exec. Excelente, tu disposición para ayudar. Muchas Gracias.!!!, Dios te proteja en todo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *