¡Hola a todos! find es un comando muy poderoso en el mundo GNU/Linux. Conocer su uso básico es de rigor, para todo administrador de éste tipo de sistemas, por cuanto les traigo un poco de información básica al respecto.
El comando find nos sirve para buscar archivos y directorios; como se mencionó anteriormente, es uno de muchos otros comandos extremadamente potentes que tiene Linux. Existen otros comandos de búsqueda pero enfocados a buscar “dentro” de los archivos:
- awk (Para manipular texto)
- sed (Permite modificar el contenido del texto)
- grep (Imprime las líneas que contengan coincidencias para la expresión regular)
A continuación, la sintaxis del comando:
find [ruta] [expresión_búsqueda] [acción]
Donde:
- [expresión_búsqueda] → Opciones de búsqueda a presentar. Por defecto, muestra el resultado de la búsqueda en pantalla.
- [acción] → Cualquier comando a ejecutarse sobre cada archivo o directorio encontrado.
Búsqueda básica
Para buscar archivos/carpetas por nombre (distingue mayúsculas y minúsculas), ejecutamos:
find / -name [nombre_archivo_carpeta]
Para buscar archivos/carpetas por nombre, sin distinción de mayúsculas y minúsculas:
find / -iname [nombre_archivo_carpeta]
Podemos usar también expresiones regulares. A continuación, se realiza la búsqueda de todos los archivos/carpetas que inician con un número dígito (del 0 al 9):
find / -name "[0-9]*"
El * es un comodín (wildcard) que viene a significar la búsqueda sobre cualquier cadena de texto.
La siguiente línea de comando muestra todos los archivos/carpetas que inician ya sea con la «M» mayúscula o minúscula.
find / -name "[Mm]*"
La siguiente línea de comando muestra todos los archivos/carpetas que inician desde la letra «a» a la «m» (según el abecedario) y que termine en .txt (o sea, un archivo con extensión .txt
find / -name "[a-m]*.txt"
Podemos hacer búsquedas de archivos/carpetas que pertenezcan a un usuario específico de la siguiente manera:
find /home -user oscard
Obviamente, podemos combinar los criterios de búsqueda a nuestra necesidad. En la siguiente línea de comando, se hace la búsqueda de archivos/carpetas que pertenezcan al usuario especificado y, adicional, que contengan la palabra enero en el nombre.
find /home -user oscard -name "*enero*"
Podemos realizar búsquedas en varias rutas a la vez. En el siguiente ejemplo, ademá de buscar dentro de /etc /usr y /var, se buscarán los archivos/carpetas que tengan que pertenezcan al grupo «admin»:
find /etc /usr /var -group admin
Podemos hacer búsquedas por tipos de archivos específicos. Recordemos que en los sistemas GNU/Linux, todos son archivos (aún los dispositivos, carpetas, enlaces, etc.). En éste caso, podemos especificar un tipo de archivo mediante el parámetro llamado type ; Los tipos de archivos pueden ser:
- b → Archivo Especial (buffered)
- c → Archivo Especial (unbuffered)
- d → Directorio
- p → Tubería avanzada
- f → Archivo regular
- l → Enlace simbólico
- s → Socket
Un ejemplo de uso puede ser, si queremos buscar únicamente carpetas con un nombre específico:
find ./ -type d -name "doc_"
Búsquedas por tiempo
Podemos hacer búsquedas por tiempo, lo cual tiene una forma un poco complicada o compleja para poder realizarse, pero es necesaria para poder detallar bien la búsqueda requerida. A continuación, se muestran los parámetros que se pueden usar:
- min → (Períodos en minutos)
- time → (Períodos de 24 horas)
Al parámetro, le antecede una letra según el siguiente significado:
- a → (access) Último acceso (lectura)
- c → (change) Cambio de estado. Por ejemplo cambio de permisos
- m → (modify) Última Modificación (escritura)
Adicional, es necesario comprender cómo se pueden hacer las búsquedas a través del tiempo; Varias opciones aceptan argumentos numéricos, estos pueden ser indicados de tres maneras posibles:
- +n → busca valores mayor que n
- -n → busca valores menor que n
- n → busca exactamente el valor n
Quizás la mejor forma de entender todo esto es mediante ejemplos prácticos. A continuación, varios ejemplos de búsqueda.
Buscar todos los archivos que se hayan modificado en los últimos 30 minutos:
find / -mmin -30 -type f
En ése caso, la primera m nos indica que se trata de «Modificación» (según lo explicado arriba), y el -30 indica valores menores de 30. Vamos a ver más detenidamente algunos ejemplos con el parámetro time, dado que es como más común hacer búsquedas por días que de minutos. Los parámetros pueden ser entonces:
- -atime
- -ctime
- -mtime
Además de saber que con time el tiempo se mide en periodos de 24 horas, es necesario saber que estos son siempre truncados. Veamos los ejemplos:
La siguiente línea de comando, busca archivos modificados entre ahora y hace un día.
find . -mtime 0
La siguiente línea, busca archivos modificados hace menos de un día.
find . -mtime -1
Busca archivos accedidos entre hace 24 y 48 horas
find . -atime 1
Busca archivos cuyo «status» (permisos) haya cambiado hace más de 48 horas
find . -ctime +1
Búsqueda por tamaño
Otras búsquedas muy útiles es por tamaño de archivos. Para éste tipo de búsquedas, es necesario tener presente lo mencionado anteriormente con respecto al uso de el más «+» y el menos «-» (en los argumentos numéricos).
Para determinar el tamaño, se admiten cuatro parámetros después del número en -size (el cual es el parámetro de tamaño que utilizaremos):
- c → bytes
- w → 2 bytes words
- k → Kilobytes
- b → 512 Bytes bloques
Veamos algunos ejemplos:
La siguiente línea de comando, busca archivos mayores a 15 Megas con extensión .jpg
find /var/log -size +15000k -name "*.jpg"
La siguiente línea, busca en el home todos los archivos menores a 800 bytes
find $HOME -800c
Búsqueda de archivos de tamaño comprendidos entre 1mb y 10mb
find . -size +1000k -and -size -10000k
Acciones sobre resultados
Con los resultados devueltos de una búsqueda específica, podemos realizar ciertas acciones. El comando find nos permite incorporar comandos externos para ejecutar sobre cada resultado devuelto. El parametros a utilizar es -exec
Veamos algunos ejemplos:
Línea de comando para buscar archivos > 3 Megas y mostrar su salida en formato ls
find /var -size +3000k -exec ls -lh {} \;
Se indica la cadena ‘{}’ que se sustituye por cada salida de find. los caracteres «\;» deben de ser agregados para que funcione bien éste tipo de ejecución.
Línea de comando para borrar archivos mayores a 1MB en la carpeta /tmp
find /tmp -size +3000k -exec rm -f {} \;
El comando find también tiene un parámetro para hacer lo mismo que la línea de comando anterior, lo cual simplifica dicha acción. Tomar en cuenta que no todas las distribuciones GNU/Linux lo soporta:
find /tmp -size +3000k -delete
Ok, sé que es mucho más extenso hablar de find… de hecho, si ustedes verifican la ayuda del mismo (man find ó find –help) encontrarán que es sumamente extenso todo lo que se puede hacer con él; en fin, por lo menos las búsquedas más cotidianas se pueden hacer con lo que se ha compartido. Espero que les sea de utilidad.
¡Saludos!