En busca de Wally

¿A quién no le interesa encontrar a esta buscada ballena en medio de un océano tan grande? Pues a nosotros no la verdad, preferimos buscar otro tipo de cosas como archivos y directorios en nuestro sistema. Para ello haremos uso de los comandos find(1), locate(1), whois(1),whereis(1).

Diferencias

find(1) a diferencia de locate(1) es un comando que busca a tiempo real y tiene muchísimas funcionalidades añadidas como filtrar por nombre, tipo de ejecutable, fecha, hora.... e incluso, eliminar los ficheros que hemos querido encontrar, mientras que locate(1) trabaja junto con una base de datos generada por updatedb(8) reduciendo drásticamente la actualización puntera de la ubicación de los ficheros y directorios además de no tener la afinidad que posee find(1).

asciicast

Trabajando con find(1)

En este artículo vamos a guiarnos más por los ejemplos que por explicar la sintaxis o los parámetros de uno en uno.

Encontrar todos aquellos ficheros y directorios que se encuentren en el directorio /etc, y que aquellos directorios a los que no no podamos acceder a su contenido, no nos muestre el error de permisos.

find /etc 2>/dev/null 

Encontrar todos aquellos archivos en /var/ cuya extensión sea .log, y que por supuesto, no muestre aquellos directorios que requieran permisos para su acceso.

find /var -name "*.log" 2>/dev/null

Mostrar todos los directorios de nuestro /home sin contar los archivos

find ~ -type d

Encontrar archivos vacíos en nuestro /home y eliminarlos todos

find ~ -empty -type f -exec rm -rf {} \;

Encontrar ficheros con extensión .log y copiarlos en una carpeta dentro de nuestro home con permisos de superusuario

sudo find /var -name ".log" -exec cp {} /home/sincorchetes/LOGS \;

Buscando archivos cuya fecha de modificación sea de hace un minuto en nuestro /home

find ~ -cmin 1 

Ficheros que han sido accedidos hace 10 minutos

find ~ -amin 10

Visualizar archivos que contengan .log de extensión, contengan permisos 644

sudo find /var -name "*.log" -perm 644

Ver archivos que pesen igual o redondeando den 2GB en nuestro directorio

find ~ -size 2G

Buscar directorios que contengan nuestro nombre de usuario, con permisos 777.

find / -user sincorchetes -type d -perm 777

Mostrar todos los archivos o directorios simbólicos que se encuentren en el directorio /dev y mostrarlo como si ejcutásemos un ls(1)

sudo find /dev -type l -ls

Listando aquellos archivos de nuestro /home cuya extensión contenga "*.avi" y sean iguales o superiores a 1G

find ~ -name "*.avi" -a -size 1G

Suprimiendo los .rpm que encontremos que lleguen a 10 megas

sudo find /var/cache/rpm -name "*.rpm" -a -size 10M -exec rm -rf {} \;

Podemos seguir ejemplos del manpages de find(1) o imaginarnos lo que se nos ocurra que podamos hacer en un futuro, estos son solo pequeños ejemplos de lo que podemos hacer con esta fantástica utilidad.

Trabajando con locate(1)

Bien, como hemos dicho anteriormente, este comando hace uso de una base de datos que por lo general suele ubicarse en /var/lib/mlocate/mlocate.db, y su fichero de configuración suele encontrarse en /etc/updatedb.conf todo depende de la distribución que utilicemos.

También podemos hacer un indexado que es registrar todos los archivos y directorios que queramos y se almacenen por un cierto orden en la base de datos de locate, sin tener que hacer uso de superusuario o creando un daemon en el sistema.

Regenerando las bases de datos

Podemos hacer que nos indexe todo lo que contenga el sistema y que lo puedan ver tod@s l@s usuari@s.

sudo updatedb

O bien, podemos generar una base de datos para nosotr@s.

mkdir .locate
updatedb -l 0 -U /DIR -o .locate/db_file

-l 0: Permite entre otras cosas, crear el fichero de la base de datos utilizando nuestro usuario. -U /DIR: Directorio a idnexar -o nombre_fichero: El nombre que le pondremos a la db

Si queremos añadir más directorios, tendremos que ejecutar el comando modificando /DIR

Buscando archivos o directorios

Basta con ejecutar locate nombre_archivo/nombre_dir y el comando nos arrojará una salida completa con las coincidencias que encuentre en la db.

Sin embargo, si queremos ejecutar nuestro fichero, tendremos que especificárselo a locate(1)

locate nombre_directorio/nombre_archivo -d .locate/db_file

Visualizando estadísticas

Se pueden ver cuántos archivos y directorios tenemos actualmente registrados en cada db.

locate -S 

ó

locate -Sd .locate/db_file

El comando whereis(1)

Este comando nos viene de fábula cuando queremos encontrar algún binario, archivo fuente o incluso páginas de manual de man(1), para hacerlo, este lleva una búsqueda en aquellos directorios que se encuentren declarados en la variable $PATH y $MANPATH. Estas variables las podemos encontrar en /etc/profile o en ~/.bash_profile (en nuestro caso)

echo $PATH

Nuestra salida:

echo $PATH
/usr/lib/qtchooser:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/sincorchetes/.composer/vendor/bin:/home/sincorchetes/.local/bin:/home/sincorchetes/bin:/home/sincorchetes/.bin/scripts

Vamos a visualizar un par de ejemplos.

Buscando una página con la coincidencia cat(1)

whereis -m cat

Encontrando la ubicación del binario

whereis -b cat

Buscando la fuente de un kernel de Fedora 28

whereis -s 4.16.8-300.fc28.

Comando whatis(1)

Este comando nos permite buscar en las páginas de man(1) y nos devuelve una descripción del mismo en una sola línea, en caso de que encuentre varios resultados, mostrará ambos o más y su categoría dentro de man(1).

whatis cat

Salida:

cat (1p)             - concatenate and print files
cat (1)              - concatenate files and print on the standard output

Podemos especificar un directorio diferente para que busque en otras páginas de man(1) pues que no tengamos instaladas en el directorio raíz o no se encuentren registradas en ~/.bash_profile

whatis -M ~/.man/ cat

Entre otras cosas

Comando apropos(1)

Este comando es parecido al anterior, lo que utiliza directamente mandb(1), también permite utilizar otra ruta de directorio para los manpages...etc

apropos whatis

Salida:

whatis (1)           - display one-line manual page descriptions

Y con esto acabamos el artículo de hoy, esperemos que os haya gustado.

¡Un saludo!

Referencias

  • manpages
    • find(1)
    • locate(1)
    • updatedb(1)
    • whereis(1)
    • whatis(1)
    • apropos(1)