systemadmin.es > Utilidades > Uso de find: Herramientas UNIX (XI)

Uso de find: Herramientas UNIX (XI)

El comando find permite la búsqueda de ficheros dentro de una estructura de directorios con una gran cantidad de opciones para la búsqueda. Vamos a ver algunas de ellas.

Su uso más simple es pasando el path (o en su defecto el directorio actual) para listar todos los fichero que existan a partir de él:

$ find
.
./test1
./test1/aaa
./test1/aab
./test1/aac
./bbx
./bbz
./bby

A partir de aquí podemos refinar la búsqueda, por ejemplo mediante la busqueda por tipo de fichero mediante -type:

$ find . -type f
./test1/aaa
./test1/aab
./test1/aac
./bbx
./bbz
./bby
$ find . -type d
.
./test1

Los tipos que permite son:

  • f: Ficheros
  • d: Directorios
  • s: Sockets
  • l: Link
  • p: Pipe
  • c: Dispositivo de caracteres
  • b: Dispositivo de bloques

Para buscar por patrones del nombre del fichero podemos usar las opciones -name y -iname. La diferencia entre name y iname es que iname es una búsqueda ignorando si es mayúscula o minúscula, por ejemplo:

$ find . -name a[a-c]*
./test1/aaa
./test1/aab
./test1/aac
$ find . -iname A[a-c]*
./test1/aaa
./test1/aab
./test1/aac

También podemos buscar por tamaño del fichero (-size), por ejemplo si queremos buscar los ficheros más grandes de un tamaño usaríamos -size con un + delante para indicar más grandes que:

# find . -size 500k
# find . -size +500k
./messages
./php.errorlog

Los multiplicadores que permite son:

  • b: bloques de 512 bytes (por defecto)
  • c: un caracter (un byte)
  • w: words (2 bytes)
  • k: kilobytes
  • M: Megabytes
  • G: Gigabytes

También podemos establecer limites por profundidad de los directorios:

  • -maxdepth: Indica un limite de directorios a los que entrar, por ejemplo, con un límite de 1 no entraría a los directorios que encontrase. Com el siguiente ejemplo lo podemos apreciar:
    $ find . -maxdepth 0
    .
    $ find . -maxdepth 1
    .
    ./test1
    ./bbx
    ./bbz
    ./bby
    $ find . -maxdepth 2
    .
    ./test1
    ./test1/aaa
    ./test1/aab
    ./test1/test2
    ./test1/aac
    ./bbx
    ./bbz
    ./bby
    $ find . -maxdepth 3
    .
    ./test1
    ./test1/aaa
    ./test1/aab
    ./test1/test2
    ./test1/test2/bba
    ./test1/test2/bbb
    ./test1/test2/bbc
    ./test1/aac
    ./bbx
    ./bbz
    ./bby
    
  • -mindepth: El caso contrario de maxdepth: permite eliminar del listado los directorios con una profundidad mínima, por ejemplo para el caso anterior:
    $ find . -mindepth 0
    .
    ./test1
    ./test1/aaa
    ./test1/aab
    ./test1/test2
    ./test1/test2/bba
    ./test1/test2/bbb
    ./test1/test2/bbc
    ./test1/aac
    ./bbx
    ./bbz
    ./bby
    $ find . -mindepth 1
    ./test1
    ./test1/aaa
    ./test1/aab
    ./test1/test2
    ./test1/test2/bba
    ./test1/test2/bbb
    ./test1/test2/bbc
    ./test1/aac
    ./bbx
    ./bbz
    ./bby
    $ find . -mindepth 2
    ./test1/aaa
    ./test1/aab
    ./test1/test2
    ./test1/test2/bba
    ./test1/test2/bbb
    ./test1/test2/bbc
    ./test1/aac
    $ find . -mindepth 3
    ./test1/test2/bba
    ./test1/test2/bbb
    ./test1/test2/bbc
    

    Otra opción muy común es -xdev que permite buscar dentro de un sistema de ficheros sin cruzar puntos de montaje. Resulta especialmente útil combinada con -size cuando queremos hacer limpieza de un sistema de ficheros que se esta llenando:

    # mount | grep var
    /dev/mapper/local-var on /var type ext3 (rw,noatime)
    /dev/mapper/local-mysql on /var/mysql type ext3 (rw,noatime)
    # touch /var/lol
    # touch /var/mysql/lol
    # find /var -name lol 
    /var/mysql/lol
    /var/lol
    # find /var -xdev -name lol 
    /var/lol
    

    Finalmente también podemos ejecutar comandos con los resultados del find mediante la opción -exec:

    • Ya sea uno a uno:
      $ find . -exec echo {} \;
      .
      ./test1
      ./test1/aaa
      ./test1/aab
      ./test1/test2
      ./test1/test2/bba
      ./test1/test2/bbb
      ./test1/test2/bbc
      ./test1/aac
      ./bbx
      ./bbz
      ./bby
      
    • O para todos los ficheros al mismo tiempo:
      $ find . -exec echo {} +
      . ./test1 ./test1/aaa ./test1/aab ./test1/test2 ./test1/test2/bba ./test1/test2/bbb ./test1/test2/bbc ./test1/aac ./bbx ./bbz ./bby
      

    Estas son solo algunas opciones del find, pero existen muchas, las cuales podemos consultarlas en el man.

    11 comments to “Uso de find: Herramientas UNIX (XI)”

    1. Jo crec que aquesta comanda l’executo com 100 vegades al dia je je:

      find . -name "*" -exec grep -l "loquesea" {} \;
      
    2. Pues con el grep recursivo me parece que te vas a ahorrar bastantes caracteres:

      $ echo "systemadmin" > f1
      $ echo "systemadmin" > test1/f2
      $ grep "system" * -R
      f1:systemadmin
      test1/f2:systemadmin
      
    3. Como siempre excelente la explicaciones para este comando!

    4. También dependiendo el OS tenemos el rgrep……

      Pa gustos …. /usr/sfw en Solaris 😉

    5. Muy buena esta información pero me podrían ayudar, necesito mover todo lo que encuentre en el find a otra carpeta y ademas necesito solo tomar los archivos de alguna fecha a otra no necesariamente la actual, la búsqueda me funciona muy bien pero me dice que no encuentra el directoria al cual quiero mover mis archivos mi código esta así:

      find /export/home -name '*.PATCH' -print -exec mv export/home/ejemplo {} \;
      
    6. De hecho seria justamente al reves:

      mv {lo que encuentres}  a export/home/ejemplo
      

      sería:

      -exec mv {} export/home/ejemplo \;
      

      saludos!

    7. ¡excelente artículo! ¡felicitaciones! y gracias…

    8. Muy bueno el post pero nadie explica para que se usa el ‘.’ puede ser una pregunta poco común, pero todos los post q vi nadie lo explicaba.

    9. Con el primer argumento indicas el directorio a partir del cual quieres empezar a buscar, en el caso del punto, el directorio actual

      saludos,

    10. Xeox, con haber buscado en google “linux single dot” lo habrías visto 🙂

    11. Como encuentro la ruta del ultimo archivo. Aclaración: tengo un archivo que puede estar en mas de un directorio, y necesito saber cual es la ruta donde esté el mas actualizado.

    Deja un comentario:

    XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>