Find es una herramienta que permite encontrar archivos, directorios y otros objetos buscando más allá del nombre, desde la fecha de modificación, contenido, nombre, ultimo acceso, fecha de creación, propietario, grupo, tamaño del archivo…
Esta herramienta es muy útil para encontrar archivos que no sabemos donde se encuentran en nuestro sistema linux mediante consola. A lo largo de esta guía veremos los usos más comunes para buscar archivos mediante el comando find.
Comando Find para buscar archivos y directorios
Sintaxis del Comando Find
La sintaxis para usar la herramienta find es la siguiente:
find “directorio a buscar” “opciones” “nombre o patrón a buscar”
Un ejemplo simple de find sería el siguiente
find / -name ‘laguialinux.html’
Con esto le decimos que busque en todo el sistema un archivo con el nombre “laguialinux.html”
Donde “/” es todo el sistema, -name indica que busque en el nombre de los archivos y laguialinux.html es el nombre del archivo.
Uso básico del comando Find
El comando find puede usarse tanto para algo tan simple como buscar archivos por nombre y además para necesidades complejas como realizar cierta operacion de cada archivo encontrado.
Buscar todos los archivos por extensión
Le indicamos con asterisco (*) que busque cualquier archivo que termine en “.zip”
find / -name *.zip
Buscar archivos por usuario
Hay varias búsquedas útiles para filtrar por usuario
Buscar archivos que no pertenecen a ningún usuario:
find / -nouser
Buscar archivos que pertenecen a un usuario (por ejemplo root)
find / -user root
Buscar archivos que pertenezcan a uno de estos dos usuarios “root” o “laguialinux”
find / -user root -o -user laguialinux
Buscar archivos por permisos
Para buscar archivos según tengan determinados permisos lo haremos de la siguiente forma con find donde “655” es el tipo de permiso que vamos a buscar:
find / -type f -perm /655
Tambien podemos filtrar archivos por permisos que tengan el bit activado, es decir, sea el valor que sea pero distinto al que le digamos. Esto es útil para saber si el propietario, grupo u otros tienen permisos ya sea de escritura, lectura o ejecución.
find / -type f -perm -110
Con este ejemplo anterior buscamos que tenga el bit ejecutable para propietario y grupo con lo que ignorará todos los archivos que no pueda ejecutar el propietario o el grupo. De esta forma sabremos que archivos tienen algún tipo de permiso y podemos controlar si influye en nuestra seguridad.
No es muy común usar este tipo de búsqueda a no ser que administres algún servidor como apache2 por ejemplo.
Buscar archivos que pertenezcan a un grupo
Con el modificador “-group” asignaremos el grupo por el que deseamos filtrar (en el ejemplo el grupo administradores)
find -group administradores
Buscar archivos que comienzan igual
Solo tenemos que colocar el nombre de comienzo para el archivo y un asterisco al final.
find / -name laguialinux*
Nos mostrará todos los archivos que empiecen por “laguialinux” como por ejemplo esta cadena de archivos:
laguialinux.rar, laguialinux.zip, laguialinux1.txt, laguialinux2.txt, laguialinux3.txt, laguialinux.html…
Buscar archivos por tamaño
El siguiente ejemplo nos buscará dentro de la carpeta del usuario laguialinux archivos con un tamaño mayor a 5MB (5000KB).
Como se puede apreciar hemos cambiado el modificador “-name” por el modificador “-size” y con el símbolo más (+) o menos (-) le indicamos que busque archivos mayores o menores del tamaño que le indicamos.
find /home/laguialinux -size +5M
También podemos indicarle otras medidas en vez de MB:
- Bytes “c”
- Kilobytes “k”
- Megabytes “M”
- Gigabytes “G”
Otro ejemplo de búsqueda por tamaño:
find /home/laguialinux/Documentos -size -35000k
Así nos buscará en el directorio “Documentos” archivos con un tamaño menor a 35MB (35.000KB).
Buscar archivos por la fecha de modificación
Para buscar mediante la fecha de modificación usaremos “-mtime” seguido del número de días que deseamos buscar. Este número si es positivo indicará a partir de tantos días mientras que si está negativo filtra hasta tantos días. En los siguientes ejemplos se comprenderá mejor.
Esto nos buscará todos los archivos de texto (txt) que hayan sido modificado en los últimos 5 días:
find / -name *.txt -mtime -5
Esto nos buscará todos los archivos de Comprimidos en ZIP (.zip) que hayan sido modificado hace más de dos días:
find / -name *.zip -mtime +2
Uso avanzado del comando Find
Esta herramienta llega mucho más lejos de lo que he mostrado anteriormente pero no es normal utilizarlo en muchos casos. De todas formas siempre podemos ver el manual así:
man find
OPCIONES
Todas las opciones siempre devuelven verdadero.
Siempre tienen efecto, en lugar de ser procesadas solamente cuando se alcance su sitio en la expresión. Por lo tanto, por claridad, lo mejor es ponerlas siempre al principio de la expresión.
Opción | Descripción |
---|---|
-daystart | Mide los tiempos (para -amin, -atime, -cmin, -ctime, -mmin, y -mtime) desde el principio del día de hoy en lugar de desde hace 24 horas. |
-depth | Procesa cada contenido del directorio antes del propio directorio. |
-follow | Desreferencia enlaces simbólicos. Implica -noleaf. |
-help, –help | Muestra un sumario del modo de empleo de find y acaba. |
-maxdepth niveles | Desciende como mucho niveles (un entero no negativo) niveles de directorios por debajo de los argumentos de la línea de órdenes. ‘-maxdepth 0’ significa que sólo se aplicarán las comparaciones y acciones a los argumentos de la línea de órdenes. |
-mindepth niveles | No aplica comparaciones ni acciones a niveles menores de niveles (un entero no negativo). ‘-mindepth 1’ significa procesar todos los ficheros excepto los argumentos de la línea de órdenes. |
-mount | No descender a directorios en otros sistemas de ficheros. Un nombre alternativo para -xdev, por compatibilidad con algunas otras versiones de find. |
-noleaf | No optimiza suponiendo que los directorios contienen dos subdirectorios menos que lo que dice su número de enlaces duros.
Esta opción es necesaria cuando se recorren sistemas de ficheros que no siguen el convenio de Unix sobre los enlaces de directorios, como sistemas de ficheros ISO-9660 (de un CD-ROM) o FAT (de MS-DOS o Windows), o puntos de montaje de volúmenes AFS (Andrew File System). Cada directorio de un sistema de ficheros normal de Unix (UFS, ext2fs, etc.) tiene por lo menos dos enlaces duros: su nombre y su entrada ‘.’ (punto). Además, sus subdirectorios (si los hay) tienen cada uno una entrada ‘..’ enlazada a este directorio. Cuando find está examinando un directorio, después de que ha hecho stat() en dos subdirectorios menos de lo que dice el número de enlaces del directorio, sabe que el resto de las entradas del directorio son no-directorios (ficheros ‘hoja’ [‘leaf’ en inglés] en el árbol del directorio). Si sólo hay que examinar los nombres de ficheros, no hay necesidad de llamar a stat() sobre ellos, lo cual proporciona un incremento significativo en la velocidad del recorrido. |
-version, –version | Muestra el número de versión de find y acaba. |
-xdev | No desciende a directorios en otros sistemas de ficheros. Vea -mount más arriba. |
COMPARACIONES
Los argumentos numéricos (anotados como el caracter n en los siguientes ejemplos, debes reemplazarlo por el valor deseado) pueden especificarse como:
Opción | Descripción |
---|---|
+n | Para mayor que n |
-n | Para menor que n |
n | Para exactamente n |
-amin n | Se ha accedido al fichero por última vez hace n minutos. |
-anewer fichero | Se ha accedido al fichero por última vez más recientemente que cuando fichero fue modificado. -anewer está afectado por -follow solamente si -follow va antes de -anewer en la línea de órdenes. |
-atime n | Se ha accedido al fichero por última vez hace n×24 horas. |
-cmin n | El status del fichero se cambió por última vez hace n minutos. |
-cnewer fichero | El status del fichero se cambió por última vez más recientemente que cuando se modificó fichero. -cnewer está afectado por -follow solamente si -follow va antes de -cnewer en la línea de órdenes. |
-ctime n | EL status del fichero se cambió por última vez hace n×24 horas. |
-empty | El fichero está vacío y es o un fichero regular o un directorio. |
-false | Siempre da falso. |
-fstype tipo | El fichero está en un sistema de ficheros de tipo tipo. Los tipos válidos de sistemas de ficheros varían según la versión de Unix; una lista incompleta de tipos de sistemas de ficheros que se aceptan en algunas versiones de Unix es: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K. Se puede usar -printf con la directiva %F para ver los tipos de sus sistemas de ficheros. (En Linux, cat /proc/filesystems dará una lista de los tipos de sistemas de ficheros reconocidos.) |
-gid n | El GID numérico del fichero es n. |
-group grupo | El fichero pertenece al grupo grupo (se permite un GID numérico). |
-ilname patrón | Como -lname, pero la concordancia no hace caso de mayúsculas ni minúsculas. |
-iname patrón | Como -name, pero la concordancia no hace caso de mayúsculas ni minúsculas. Por ejemplo, los patrones ‘fo*’ y ‘F??’ concuerdan con los nombres de ficheros ‘Foo’, ‘FOO’, ‘foo’, ‘fOo’, etc. |
-inum n | El fichero tiene de número-i n. |
-ipath patrón | Como -path, pero la concordancia no hace caso de mayúsculas ni minúsculas. |
-iregex patrón | Como -regex, pero la concordancia no hace caso de mayúsculas ni minúsculas. |
-links n | El fichero tiene n enlaces. |
-lname patrón | El fichero es un enlace simbólico cuyos contenidos concuerdan con el patrón del shell patrón. Los metacaracteres no tratan especialmente a ‘/’ ni a ‘.’. |
-mmin n | Los datos del fichero fueron modificados por última vez hace n minutos. |
-mtime n | Los datos del fichero fueron modificados por última vez hace n×24 horas. |
-name patrón | La base del nombre del fichero (el camino sin los directorios) concuerda con el patrón del shell patrón. Los metacaracteres (‘*’, ‘?’ y ‘[]’) no concuerdan con un ‘.’ al principio del nombre base. Para omitir un directorio y los ficheros bajo él, emplee -prune; vea un ejemplo en la descripción de -path. |
-newer fichero | El fichero fue modificado más recientemente que fichero. -newer es afectado por -follow solamente si -follow va antes de -newer en la línea de órdenes. |
-nouser | Ningún usuario se corresponde con el UID numérico del fichero. |
-nogroup | Ningún grupo se corresponde con el GID numérico del fichero. |
-path patrón | El nombre del fichero concuerda con el patrón del shell patrón. Los metacaracteres no tratan de forma especial a ‘/’ o a ‘.’; así, por ejemplo, find . -path ‘./sr*sc’ mostrará una entrada para un directorio llamado ‘./src/misc’ (si es que existe). Para omitir un árbol entero de directorio, emplee -prune en vez de comprobar cada fichero en el árbol.
Por ejemplo, para pasar el directorio ‘src/emacs’ y todos los ficheros y directorios bajo él, y mostrar los nombres de los otros ficheros encontrados, haga algo como esto: find . -path ‘./src/emacs’ -prune -o -print |
-perm modo | Los bits de permiso del fichero son exactamente modo (octal o simbólico). Los modos simbólicos utilizarán 0 como punto de partida. |
-perm -modo | Todos los bits de permiso modo están activos para el fichero. |
-perm +modo | Cualquiera de los bits de permiso de modo está activo para el fichero. |
-regex patrón | El nombre del fichero concuerda con la expresión regular patrón. Esta concordancia es en el camino entero, no es una búsqueda. Por ejemplo, para un fichero llamado ‘./fubar3’, Ud. puede emplear la expresión regular ‘.*bar.’ or ‘.*b.*3’, mas no ‘b.*r3’. |
-size n[bckw] | El fichero emplea n unidades de espacio. Las unidades son bloques de 512 bytes si no se dice otra cosa o si la letra ‘b’ sigue a n, bloques de bytes si se pone la letra ‘c’, kilobytes con la ‘k’, o palabras de 2 bytes con la ‘w’. El tamaño no cuenta bloques indirectos, pero sí cuenta bloques en ficheros esparcidos que no están realmente asignados. |
-true | Siempre da verdadero. |
-type c | El fichero es de tipo c. Los tipos posibles y que pueden reemplzar a este al buscar por tipo son los siguientes:
|
-uid n | El UID numérico del propietario del fichero es n. |
-used n | Se accedió por última vez al fichero n días después de que se cambió por última vez su estado. |
-user usuario | El propietario del fichero es el usuario usuario (se permite un UID numérico). |
-xtype c | Lo mismo que -type a menos que el fichero sea un enlace simbólico. Para enlaces simbólicos: si no se ha dado -follow, verdad si el fichero es un enlace a un fichero de tipo c; si no, verdad si c es ‘l’. En otras palabras, para enlaces simbólicos, -xtype comprueba el tipo del fichero que -type no comprueba. |
ACCIONES
Opción | Descripción |
---|---|
-exec orden {} \; | Ejecuta el comando u orden por cada archivo que se interpreta con {} verdad si se devuelve el status 0. Todos los argumentos que siguen a find se toman como de la orden hasta que se encuentre uno consistente en ‘;’.
La cadena ‘{}’ se reemplaza por el nombre del fichero que se está procesando; en cualquier sitio de los argumentos de la orden, no sólo en argumentos donde esté sola, como en algunas otras versiones de find. Ambas construcciones pueden necesitar ‘escaparse’ (con una ‘\’) o entrecomillarse, para protegerlas de la expansión que efectuaría el shell. La orden se ejecuta en el directorio de comienzo. |
-fls fichero | Verdad; como -ls pero escribe en fichero como -fprint. |
-fprint fichero | Verdad; escribe el nombre completo del fichero en fichero. Si fichero no existe cuando se ejecuta find, se crea; si existe, se trunca.
Los nombres de ficheros ”/dev/stdout” y ”/dev/stderr” se manejan de manera especial; se refieren a la salida estándar y la salida estándar de errores, respectivamente. |
-fprint0 fichero | Verdad; como -print0 pero escribe en fichero como -fprint. |
-fprintf fichero formato | Verdad; como -printf pero escribe en fichero como -fprint. |
-ok orden ; | Como -exec pero pregunta primero al usuario (en la entrada estándar); si la respuesta no comienza con ‘y’ o ‘Y’ (o quizás el equivalente local, en español ‘s’ o ‘S’), no se ejecuta la orden, y devuelve falso. |
Verdad; imprime el nombre completo del fichero en la salida estándar, seguido por un salto de línea. | |
-print0 | Verdad; imprime el nombre completo del fichero en la salida estándar, seguido por un carácter nulo.
Esto permite que nombres de ficheros que contengan saltos de línea sean correctamente interpretados por programas que procesen la salida de find. |
-printf formato | Verdad; imprime formato en la salida estándar, interpretando secuencias de escape ‘\’ y directivas ‘%’. Las anchuras de campo y precisiones pueden especificarse como en la función de C ‘printf’.
De forma contraria a lo que hace -print, -printf no añade un salto de línea al final de la cadena. Las secuencias de escape y directivas son:
Es posible tratar campos de tiempo:
Campos de fecha:
Otros codes:
|
-prune | Si -depth no se da, devuelve verdad; no desciende por el directorio en curso. |
-ls | Verdad; lista el fichero actual en el formato de ‘ls -dils’ en la salida estándar. Los números de bloques son en bloques de 1 kB, a menos que la variable de ambiente POSIXLY_CORRECT esté definida, en cuyo caso los bloques son de 512 B. |
OPERADORES
Listados en orden de precedencia decreciente:
Opción | Descripción |
---|---|
( expr ) | Fuerza la precedencia. |
! expr | Verdad si expr es falsa. |
-not expr | Lo mismo que ! expr. |
expr1 expr2 | Y (implícito); expr2 no se evalúa si expr1 es falsa. |
expr1 -a expr2 | Lo mismo que expr1 expr2. |
expr1 -and expr2 | Lo mismo que expr1 expr2. |
expr1 -o expr2 | O; expr2 no se evalúa si expr1 es verdad. |
expr1 -or expr2 | Lo mismo que expr1 -o expr2. |
expr1 , expr2 | Lista; expr1 y expr2 son, ambos, evaluados siempre. El valor de expr1 se descarta; el valor de la lista es el de expr2. |