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)”
•Deja un comentario:
- Ya sea uno a uno:
7. June 2010 at 11:52 am :
Jo crec que aquesta comanda l’executo com 100 vegades al dia je je:
7. June 2010 at 12:00 pm :
Pues con el grep recursivo me parece que te vas a ahorrar bastantes caracteres:
7. June 2010 at 12:46 pm :
Como siempre excelente la explicaciones para este comando!
7. June 2010 at 1:43 pm :
También dependiendo el OS tenemos el rgrep……
Pa gustos …. /usr/sfw en Solaris 😉
20. July 2010 at 5:35 pm :
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í:
22. July 2010 at 8:05 am :
De hecho seria justamente al reves:
sería:
saludos!
16. December 2010 at 2:01 pm :
¡excelente artículo! ¡felicitaciones! y gracias…
28. June 2012 at 8:24 pm :
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.
29. June 2012 at 7:48 am :
Con el primer argumento indicas el directorio a partir del cual quieres empezar a buscar, en el caso del punto, el directorio actual
saludos,
3. July 2012 at 8:30 am :
Xeox, con haber buscado en google “linux single dot” lo habrías visto 🙂
28. November 2012 at 5:57 pm :
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.