jueves, 21 de febrero de 2019

¿Cómo buscar archivos a traves de la consola en GNU/Linux?


     Lo primero que debemos saber es ¿Qué es find o comando find?

Find es un comando común en sistemas Unix que se utiliza para encontrar archivos en un determinado directorio a partir de diversas reglas de búsqueda, tales como nombre exacto de archivo, fecha de creación, tamaño, permisos, etc. llegando a ser muy flexible y una de las herramientas más útiles en la administración de sistemas cuando se sabe utilizar. En los sistemas GNU/Linux forma parte del paquete findutils.
Fuente: wikipedia

     Con el siguiente comando podremos buscar en todo nuestro sistema operativo algún archivo que no encontremos fácilmente a continuación el comando:

find / -name arch.txt

     Donde find es el comando el / es el directorio donde se buscara el archivo y donde -name le decimos a find que busque por nombre y arch.txt es el nombre del archivo a buscar.

     Búsquedas en múltiples directorios:

     Find es una herramienta que no se limita a la búsqueda en un solo directorio el mismo puede hacer búsquedas en múltiples directorios a continuación un ejemplo:

find /home/usuario/documentos /home/usuario/descargas -name arch.txt

     Búsquedas de acuerdo al tiempo de creación o modificación de los archivos.

     Se disponen aun de funciones más avanzadas para la realización de búsquedas a continuación una búsqueda de los archivos modificados los últimos 30 minutos:

find / -mmin -30 -type f

     Los modificados exactamente hace 30 minutos:

find / -mmin 30 -type f

     Si quieres buscar en un rango específico de minutos, con el siguiente ejemplo buscarías todos los directorios que hayan cambiado hace más de 10 minutos (+10) y menos de 30 (-30):


find / -mmin +10 -mmin -30 -type d

     Find ofrece varias opciones de búsqueda por tiempo, pero las principales son: -amin, -atime, -cmin, ctime, -mmin y -mtime. "min" es para periodos de minutos y "time" para periodos de 24 horas. Los que empiezan con "a" (access) indica el tiempo en que fue accedido (leido) por última vez un archivo. Los que empiezan con "c" (change) indica el tiempo que cambió por última vez el status de un archivo, por ejemplo sus permisos. Los que empiezan con "m" (modify) indica el tiempo en que fue modificado (escrito) por última vez un archivo. Una consideración a tener con las búsquedas -atime, -ctime y -mtime es que el tiempo se mide en periodos de 24 horas y estos son siempre truncados, con ejemplos es más claro:

find . -mtime 0  (busca archivos modificados entre ahora y hace un dia)
find . -mtime -1 (busca archivos modificados hace menos de un dia)
find . -atime 1  (busca archivos accedidos entre hace 24 y 48 horas)
find . -ctime +1 (busca archivos cuyo status haya cambiado hace más de 48 horas)

     Búsquedas de acuerdo al uso de almacenamiento en disco de los archivo.

Con find es muy fácil realizar búsquedas por tamaño, se indica con la opción -size, se aplican las mismas reglas para argumentos numéricos (+n -n n).

find /var/log -size +15000k -name "*.jpg" (busca archivos mayores a 15 megas del tipo jpg)

find $HOME -800c (busca en tu home todos los archivos menores a 800 bytes (799 realmente)

(archivos de tamaño comprendidos entre 1mb y 10mb)

find . -size +1000k -and -size -10000k

     Se admiten cuatro parámetros después del número en -size:

c = bytes
w = 2 byte words
k = kilobytes
b = 512-byte bloques

     Para buscar archivos vacíos puedes entonces hacer lo siguiente:

find . -size 0c

     (Aunque la opción -empty hace lo mismo más eficientemente)

find . -empty

     Cualquiera de los ejemplos anteriores dará un aburrido listado de los archivos y sus rutas. Si lo que quieres es realizar una acción (ejecutar un comando) sobre estos usa entonces la opción entonces -exec.

     Comparaciones -and, -or y -not.

     Find también incluye operadores booleanos que la hace una herramienta aun más últil:

find /home -name 'ventas*' -and -mmin 120

find /home -name 'reporte[_-]*' -not -user sergio

find /home -iname '*enero*' -or -group gerentes

     El primer ejemplo busca todos los archivos que comiencen con 'ventas' Y que hayan sido modificados o cambiados en las últimas dos horas (120 minutos).

     El segundo ejemplo busca todos los archivos que comiencen con 'reporte' y después siga un _ o un - y que NO pertenezcan al usuario sergio.

     El tercer ejemplo busca todos los archivos que contengan la palabra enero, Enero, ENERO, etc. (sin importar si lleva mayúsculas o minúsculas) O cualquier otro archivo que encuentre que pertenezca al grupo 'gerentes'.

     Estas opciones de booleanos tienen su correspondiente abreviatura: -and se puede indicar también como -a -or se puede indicar también como -o -not se puede indicar también como !

     Opción -exec para la ejecución de otros comandos.

     -exec permite ejecutar acciones sobre el resultado de cada línea o archivo devuelto por find, o en otras palabras permite incorporar comandos externos para ejecutar sobre cada resultado devuelto. Muy interesante.
     Asi por ejemplo, si queremos buscar todos los archivos mayores a 3 megas en /var y además mostrar su salida en formato ls, podemos hacer lo siguiente:

find /var -size +3000k -exec ls -lh {} \;

Después de ls -lh que nos devuelve una salida formateada de ls se indica la cadena '{}' que se sustituye por cada salida de find. No hay límite para lo que se puede lograr, asi por ejemplo, borrar todo lo mayor a un mega en /tmp.

find /tmp -size +1024k -exec rm -f {} \;

Por cierto si usas la versión GNU de find (y creo que todos los que usamos Linux la tenemos, compruébalo con find --version)), lo anterior también funciona directamente con la opción -delete:

find /tmp -size +3000k -delete (lo mismo que usar -exec con rm)


     Si te gustó esta entrada no dudes en realizar un donativo.


No hay comentarios:

Publicar un comentario