Busqueda de archivos

La busqueda de archivos es una tarea frecuente en un sistema, veamos un par de herramientas para llevar a cabo esta tarea.

  • locate
  • find

locate

locate en ubuntu?open in new window

Una forma sencilla de encontrar archivos es mediante el programa locate, el cual realiza una búsqueda rápida en una base de datos de directorios, y finalmente retorna cada nombre que coincida con el criterio.

Por ejemplo si se quiere encontrar todos los programas con el texto zip en el nombre:

locate zip

Y en caso de que se requiera alguna búsqueda más avanzada, se puede combinar con otras herramientas, como grep.

locate zip | grep bin

La base de datos de locate es creada por otro programa llamado updatedb, usualmente corre de forma periodica como un cron job, de todos modos la mayoría de los sistemas con locate lo ejecutan una vez al día. Ya que esta base de datos no es actualizada continuamente, cambios recientes no serán reflejados al momento de buscar con esta herramienta. En caso de ser necesario se puede ejecutar con el usuario root updatedb de forma manual.

find

Mientras que el programa locate utiliza únicamente el nombre del archivo, find puede encontrar archivos dentro de un directorio dado (y sub directorios), utilizando varios atributos.

En su modo más simple, pasando uno o más directorios para buscar retornará su contenido.

find ~

lo que podríamos combinar con wc mediante una pipe para obtener el número de archivos:

find ~ | wc -l

Test

Para que find sea realmente útil es posible utilizar tests, los que realizarán un filtrado de los archivos que retornará, por ejemplo si quisieramos obtener sólo los directorios:

find ~ -type d | wc -l

tipoDescripción
bArchivo de dispositivo de bloque
cArchivo especial de caracteres
dDirectorio
fArchivo regular
lLink simbólico

Y así podemos agregar más tests, por ejemplo, especificar el nombre del archivo, o un patron, en este caso los archivos con extensión .jpg que son más grandes que 1MB.

find ~ -type f -name "*.jpg" -size +1M | wc -l

Tabla de unidades de medida:

CaracterDescripción
bbloque de 512-byte (default)
cBytes
wpalabras de 2-byte
kKilobytes
MMegabytes
GGigabytes

Tabla de tests:

TestDescripción
-cmin nmodificado hace n minutos.
-cnewer archivoModificado más recientemente que el archivo
-ctime nmodificado hace n*24 horas
-emptyArchivos y directorios vacíos
-group namePerteneciente al grupo
-iname patronTal que el nombre pero insencible a mayúsc. y mins.
-inum nNumero de inodo
-mmin nModificado por lo menos hace n minutos
-mtime nModificado por lo menos hace n*24 horas
-name patronPor nombre
-newer archivoMás reciente que el archivo
-nouserSin usuario válido
-nogroupSin grupo válido
-perm modeCon determinados permisos
-samefile archivoSimilar a -inum pero haciendo referencia al archivo
-size nPor tamaño
-type cPor tipo
-user usuarioPerteneciente al usuario

Operadores

Además de los test en algunos casos es necesario realizar operaciones lógicas para lograr el resultado deseado, por ejemplo si necesitamos saber los archivos y directorios con permisos seguros deberíamos hacer una distinción entre directorios con permisos 0700 y archivos con permisos 0600.

find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)

  • -and, -a
  • -or, -o
  • -not, !
  • ()

Acciones

Obtener la lista de archivos con un filtro específico puede ser muy útil, podemos realizar un pipeline tal como lo hicimos con wc. De todos modos find incluye un mecanismo para realizar acciones.

Algunas acciones predefinidas:

AcciónDescripción
-deleteElimina el archivo encontrado.
-lsEjecuta el comando equivalente a ls -dils
-printImprime el pathname completo. (default)
-quitFinaliza una vez que se encuentra un resultado

Ejemplos:

  • find ~ -type f -name '*.bak' -delete
  • find ~ -type f -name '*.bak' -print
  • find ~ -type f -name '*.bak' -ls

A su vez nos permite ejecutar acciones definidas por el usuario:

Por ejemplo, -delete se podría definir de este modo:

find -type f -name 'foo*' -exec rm '{}' ';'

o mediante una confirmación:

find -type f -name 'foo*' -ok rm '{}' ';'

Eficiencia

El comando anterior se ejecuta por cada resultado, en muchos casos va a ser más útil y eficiente ejecutar la acción una única vez para el total de resultados:

ls -l archivo_01
ls -l archivo_02
ls -l archivo_03
1
2
3

Por otro lado sería más efectivo: ls -l archivo_01 archivo_02 archivo_03

Esto es posible sustituyendo el caracter ; por el signo +.

find -type f -name 'foo*' -ok ls '{}' +

Last Updated: 9/2/2021, 10:37:52 PM
Contributors: Diego Mascheroni