A veces uno se encuentra con el problema de no recordar donde puso un archivo, entonces es necesario buscarlo. Para esto, sólo es necesario recordar el nombre (o parte del nombre) del archivo. Para buscar archivos por nombre en GNU/Linux es posible utilizar las herramientas find y locate (estaba escribiendo "los comandos" pero me arrepentí y borré, en general no me gusta utilizar la palabra "comando" ya que los usuarios menos expertos suelen tenerle pánico a la misma, un "comando" es una porción de texto críptico, escrito en un lenguaje que sólo entienden las computadoras, que realiza tareas incomprensibles y puede causar la destrucción total del planeta, en cambio una "herramienta" es algo que nos facilita la vida).



El comando find se utiliza para buscar archivos en una jerarquía de directorio. Debido a que find es uno de los comandos una de las herramientas más completas, complejas y poderosas de la consola/terminal/línea de comandos/shell siempre evité escribir un artículo al respecto por miedo a "faltarle el respeto" a find. Pero para romper el hielo, mejor empezar con algunos ejemplos básicos.

Supongamos que deseamos buscar un archivo cuyo nombre contiene la palabra "webbios" en todo el sistema de archivos. Para ello debemos utilizar find con la siguiente sintaxis:

$ find / -name '*webbios*'

El primer parámetro (/) es el directorio desde donde realizar la búsqueda y el segundo parámetro (-name '*webbios*') es lo que deseamos buscar, en este caso archivos cuyo nombre contenga la palabra "webbios".

Al realizar la búsqueda desde el directorio raíz como usuario no-root, la salida será algo así:

find: `/lost+found': Permission denied                         
find: `/boot/lost+found': Permission denied                    
find: `/tmp/orbit-gdm': Permission denied                      
find: `/tmp/pulse-WUnME8JQKXYc': Permission denied             
find: `/tmp/.esd-501': Permission denied                       
find: `/tmp/virtual-pepe.tLPisi': Permission denied            
find: `/tmp/pulse-3MBXbRri4Zil': Permission denied             
find: `/proc/tty/driver': Permission denied                    
find: `/proc/1/task/1/fd': Permission denied                   
find: `/proc/1/task/1/fdinfo': Permission denied               
find: `/proc/1/fd': Permission denied                          
find: `/proc/1/fdinfo': Permission denied                      
find: `/proc/2/task/2/fd': Permission denied                   
find: `/proc/2/task/2/fdinfo': Permission denied               
find: `/proc/2/fd': Permission denied                          
find: `/proc/2/fdinfo': Permission denied                      
find: `/proc/3/task/3/fd': Permission denied                   
find: `/proc/3/task/3/fdinfo': Permission denied               
[...]

Lo que sucede es que find trata de leer archivos o directorios donde el usuario actual no tiene permisos de lectura. Esto es realmente molesto y lo peor es que los resultados de la búsqueda se pierden entre tanto ruido. Para evitar esto hay dos alternativas: ejecutar find con un usuario con mayores privilegios de lectura (ej: root) o redirigir la salida de errores ("standard error") a /dev/null. De esta forma el resultado es el siguiente:

$ find / -name '*webbios*' 2>/dev/null
$

Ahora nos enfrentamos con otro problema: la salida de la ejecución es nula, esto significa que no encontró resultados, sin embargo yo estoy seguro de que existe al menos un archivo que contiene la palabra webbios en su nombre. Lo que sucede es que la opción -name es sensible a las mayúsculas ("case-sensitive"), por lo tanto debe respetarse el case:

$ find / -name '*WebBIOS*' 2>/dev/null
/data/manuales/WebBIOS Configuration Utility Guide.pdf

La salida indica la ruta de cada archivo que coincide con la búsqueda.

Con find se pueden realizar todo tipo de tareas, lo más recomendable es darle una leída a conciencia al man page. Se sorprenderán con todo lo que es capaz de hacer!

Ahora veamos algunos ejemplos un poco más avanzados que me motivaron a escribir este artículo, ya que necesité realizar movimientos en directorios de backup. La opción -mtime permite aplicar criterios de búsqueda relativos a la fecha de modificación de los archivos y directorios:

Buscar dentro del directorio "/backup" todos los archivos que tengan más de 10 días de antigüedad:

find /backup -type f -mtime +10

Buscar dentro del directorio "/backup" todos los archivos que no tengan más de 1 día de antigüedad:

find /backup -type f -mtime -1

La acción -exec permite ejecutar un comando sobre cada uno de los resultados de la búsqueda. El texto {} se reemplaza por el nombre de archivo actual en cada aparición. Combinando -mtime y -exec puedo armar un comando para mover a otro directorio todos los archivos (-type f) dentro de "/backup" que tengan más de 10 días de antigüedad, por ejemplo:

find /backup -type f -mtime -1 -exec cp {} /backup2/ \;

A veces es necesario combinar find con otras herramientas como grep o awk para filtrar la salida de forma más avanzada. Por ejemplo, buscar todos los archivos dentro del directorio "/backup" que no tengan más de 6 días de antigüedad, y que además no aparezca la palabra "testing" en cualquier parte de la ruta:

find /backup/ -type f -mtime -6 | grep -v testing

Estos son apenas algunos ejemplos de cosas interesantes que se pueden hacer utilizando find. Existen numerosos TESTS que se pueden aplicar a la búsqueda y muchas ACCIONES que se pueden realizar sobre los resultados. Me atrevo a decir que quien domina a find, domina la consola. Prometo ir agregando más ejemplos a medida que vaya recordando y realizando nuevas tareas interesantes utilizando find.

locate

Si lo que se desea es simplemente buscar archivos, lo mejor es utilizar locate ya que find puede ser un poco lento cuando se busca en un árbol de directorios muy grande. locate no busca directamente en el sistema de archivos sino que busca en una base de datos. Es bastante más rápido pero la base de datos debe ser actualizada utilizando el comando updatedb. En algunas distribuciones la base de datos es actualizada automáticamente utilizando una tarea de cron. En CentOS 6, por ejemplo, la base de datos se encuentra en el archivo /var/lib/mlocate/mlocate.db y es actualizada a diario automáticamente por la tarea cron /etc/cron.daily/mlocate.cron.

La ventaja adicional de locate (además de la velocidad) es que permite buscar ignorando el case (es decir, no sensible a las mayúsculas) utilizando el parámetro -i, por ejemplo:

$ locate -i webbios
/data/manuales/WebBIOS Configuration Utility Guide.pdf

Si se desea actualizar la base de datos manualmente se debe ejecutar:

# updatedb

o

$ sudo updatedb

Para finalizar, una comparación de rendimiento, se debe destacar que se trata de un filesystem "pequeño" (de una workstation):

$ time find / -name '*WebBIOS*' 2>/dev/null
/data/manuales/WebBIOS Configuration Utility Guide.pdf

real    0m1.356s
user    0m0.326s
sys     0m0.406s
$ time locate -i webbios
/data/manuales/WebBIOS Configuration Utility Guide.pdf

real    0m0.264s
user    0m0.262s
sys     0m0.001s


Tal vez pueda interesarte


Compartí este artículo