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 . -cmin +2 -cmin -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
Reblogged this on Flossblog.