Comando find – 25 ejemplos prácticos

GNU/Linux
find es un utilitario que permite realizar búsqueda de ficheros (fichero regular, directorio,
enlace simbólico, …) a través de una jerarquía de directorios, es poderoso y rico en funcionalidades.

El comando find permite encontrar ficheros que:

– Sus nombres contengan un determinado texto o case con una determinada
expresion regular
– Sean enlaces a determinados ficheros
– Fueron accedidos en un período de tiempo determinado
– Tienen un determinado tamaño
– Son ficheros de un determinado tipo: fichero regular, directorio,
enlace simbólico, socket, …
– Tienen como propietarios un usuario y grupo determinado
– Tienen un determinado permiso de acceso
– Contienen texto que casa con un patrón determinado
– Se encuentra en un nivel determinado en la estructura de
directorios
– O alguna combinación de lo anterior

Una vez encontrado lo que estas buscando puedes:

– Ver o editar
– Almacenar
– Eliminar / Renombrar
– Cambiar permisos
– Agrupar y más

En este artículo mostraremos como usar find a través de ejemplos

Búsqueda básica

1. Encontrar todos los ficheros regulares

$ find Symfony -type f
Symfony/web/.htaccess
Symfony/web/app.php
Symfony/web/app_dev.php
Symfony/web/robots.txt
...

2. Encontrar todos los directorios

$ find Symfony -type d
Symfony/
Symfony/web
Symfony/web/bundles
Symfony/web/bundles/webprofiler
...

3. Búsqueda basada en el nombre de los ficheros o directorios

$ find Symfony -name '*config*'
Symfony/app/config
Symfony/app/config/config_prod.yml
Symfony/app/config/config.yml
...

4. Búsqueda basada en el nombre ignorando mayúsculas y minúsculas

$ find Symfony -iname '*config*'
...
Symfony/.../Loader/ConfigurationLoader.php
Symfony/.../ConfigurationResource.php
...
Symfony/app/config
Symfony/app/config/config_prod.yml
Symfony/app/config/config.yml
...

Búsqueda basada en el tamaño de los ficheros

5. Encontrar todos los ficheros con tamaño igual a 300MB

$ find . -size 300M

6. Encontrar ficheros con tamaño mayor a 300MB

$ find . -size +300M

7. Encontrar ficheros con tamaño menor a 300MB

$ find . -size -300M

8. Encontrar todos los ficheros con tamaño mayor igual a 270MB y menor a 300MB

$ find . -size +270M -size -300M

9. Encontrar ficheros y directorios vacíos

$ find . -empty

GNU/Linux almacena la última fecha de las siguientes operaciones realizadas sobre un fichero:
– acceso (cuando se lee el contenido de un fichero)
– cambio de estado (se modifica el fichero o sus atributos)
– modificación (cambia el contenido de un fichero)

Búsqueda basada en fechas

find permite relizar búsquedas basadas en las operaciones anteriores usando operadores de tiempo:

Operaración Operador asociado
acceso -atime,-amin
cambio de estado -ctime,-cmin
modificación -mtime,-mmin

10. Encontrar los ficheros que fueron modificados (contenido) hace más de 7 días

$ find . -mtime +7

11. Encontrar los ficheros que fueron accedidos hace menos de 15 días

$ find . -mtime -15

12. Encontrar los ficheros a los cuales se les cambio el estado en un período entre 2 y 6 minutos atrás

$ find . -amin +2 -amin -6

Búsqueda basada en el propietario y grupo

13. Encontrar los ficheros cuyo propietario es sedlav

$ find . -user sedlav -type f

14. Encontrar los ficheros que pertenecen al grupo flossblog

$ find . -group flossblog -type f

find permite encontrar ficheros usando el identificador númerico del propietario y grupo, la ventaja de usar este método es que permite especificar rangos.

15. Encontrar los ficheros cuyo propietario tiene un uid entre 500 y 1000 (Se excluyen los extremos)

$ find . -uid +500 -uid -1000 -type f

En ocasiones es necesario encontrar todos los ficheros huerfanos por ejemplo si tenemos indicios de alguna comportamiento inusual de nuestro sevidor o estación de trabajo podemos empezar nuestra pesquiza encontrando todos lo ficheros que no pertenecen a ningún usuario o grupo

16. Encontrar los ficheros que no pertenecen a ningún usuario

$ find . -nouser

17. Encontrar los ficheros que no pertenecen a ningún grupo

$ find . -nogroup

Búsqueda basada en los permisos de los ficheros

find permite encontrar ficheros para los cuales el usuario actual tiene permisos de lectura (-readable), escritura (-writeable) y ejecución (-executable) o aquellos ficheros que tienen un determinado modo (-perm)

18. Encontrar todos ficheros que el usuario actual puede leer

$ find . -readable

19. Encontrar todos ficheros que el usuario actual puede modificar

$ find . -writable

20. Encontrar todos ficheros que el usuario actual puede ejecutar

$ find . -executable

Encontrar los ficheros que tienen un determinado modo

-perm PMODE, PMODE puede ser númerico o simbólico y puede prefijarse con: /, . Si PMODE no se prefija con / o entonces los permisos del fichero debe casar exactamente con PMODE.

Si PMODE se prefija con , entonces casa si los permisos del fichero contiene a PMODE

Si PMODE se prefija con con /, entonces casa si cualquiera de los bits establecido en PMODE estan presente en los permisos del fichero

Ejemplos:

21. Encontrar todos los ficheros cuyo propietario y grupo tienen permisos de lectura y escritura y y el resto del mundo permiso de lectura
$ find -perm 664
22. Encontrar todos los ficheros cuyo propietario y grupo tienen permisos de lectura y escritura y el resto del mundo permiso de lectura

Nótese el antes del modo, por tanto aquí tambien casan los ficheros que tienen los siguientes permisos: 777, 666, 776

$ find . -perm -664
23. Encontrar todos los ficheros que pueden ser modificados por cualquier usuario
$ find . -perm /222

Búsqueda avanzada

24. Búsqueda basada en expresiones regulares descendiendo un solo nivel

Encontrar todos los directorios que contiene proyectos descendiendo a un solo nivel (Búsqueda no recursiva), que no sean vacios, no terminen en un digito, old, backups, bkp ni contengan las palabras backup, copy, new, back seguida de un guión, guión bajo o punto.

$ PATTERN=".*/((.*([0-9]|old|ba?c?ku?ps?))|(..*)|(copy|new|backup|back|)[-_.].*)$"
$ find proyectos -maxdepth 1 -mindepth 1 -regextype posix-egrep ! -iregex  $PATTERN  ! -empty -type d 

25. Combinando find, xargs y grep

Esta es una de mis combinaciones favoritas pues combinando los comandos anteriores puedo realizar búsquedas personalizadas. Por ejemplo si queremos buscar la palabra ireg en todos los ficheros php de nuestro proyecto entonces haríamos los siguiente:

$ find proyectos -name '*.php' -type f -print0 | xargs -0 grep -l ireg

Lecturas recomendadas

– man find
– info find




1 Comentario

  1. sedlav

    Reblogged this on Flossblog.

    Responder

Dejar un comentario

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