Cómo buscar con la línea de comandos de Linux

Cómo buscar con la línea de comandos de Linux

Con el correr del tiempo, en cualquier estación de trabajo o servidor se acumulan archivos y directorios productos de su uso. En esta guía aprenderás cómo buscar con la línea de comandos de Linux para localizar esos recursos. Aunque las distribuciones de escritorio permiten emplear una interfaz gráfica para esa tarea, en un VPS no es posible. Además, conocer las herramientas para hacer búsquedas desde una shell es una habilidad muy valiosa al trabajar con el sistema operativo.

El comando find se utiliza para buscar archivos y directorios que cumplan con
ciertas características (nombre, propietario, grupo, tipo, permisos, fechas y otros criterios). De no especificarse lo contrario con la opción -maxdepth, las búsquedas se aplican al directorio actual y a cualquier subdirectorio. Posteriormente, find puede mostrar la lista de resultados o realizar otras operaciones sobre estos.

Requisitos previos

A fin de seguir este artículo, necesitarás un servidor Ubuntu 20.04 con un usuario que tenga acceso a sudo como explicamos anteriormente.

Buscar por tipo de archivo

En Linux, todo recurso del sistema puede considerarse como un archivo. Sin embargo, hay distintos tipos que podemos encontrar:

SímboloTipo de archivo
bbloques
ccaracteres
ddirectorio
farchivo común
lenlace simbólico
ptubería con nombre
ssocket

Por lo general, el punto de inicio aparece primero antes que cualquier otra opción. De no estar presente, find hará la búsqueda en el directorio actual. Los siguientes ejemplos nos permitirán ilustrar el uso de algunas de estas opciones, donde el punto (.) representa el directorio actual.

find . -maxdepth 0 -type f # Ver todos los archivos comunes en el directorio actual
find /dev -type c # Buscar archivos de caracteres dentro de /dev
find -maxdepth 1 -type d # Encontrar los subdirectorios de la ubicación actual (no recursivo)

Buscar por nombre o extensión

Para buscar un archivo por su nombre, utilizaremos la opción -name (o -iname para ignorar diferencias entre mayúsculas y minúsculas). También podemos emplear comodines si encerramos el patrón de búsqueda entre comillas.

find . -type d -iname test # Buscar directorios llamados test, Test, TeSt, etc.
find . -type f -name "*.sh" # Buscar archivos con la extensión .sh
find . -maxdepth 2 -type f -name "*.sh" # Descender hasta dos subdirectorios como máximo

Buscar por fecha de creación, modificación o acceso

Cada archivo tiene tres fechas asociadas:

  • Creación (cuando lo generamos): ctime
  • Modificación (cuando lo actualizamos): mtime
  • Acceso (cuando lo leímos por última vez): atime

Las búsquedas con find emplean los signos + y – para devolver resultados dentro del período que especifiquemos. Por ejemplo:

find . -type f -mtime -1 # Archivos modificados durante el último día (24 horas)
find . -type f -ctime -1 # ... creados
find . -type f -atime -1 # ... accedidos
find /etc/ssh -maxdepth 1 -type f -mtime +15 # Archivos dentro de /etc/ssh que fueron modificados hace más de 15 días (no incluye subdirectorios)
linea de comandos en linux
Cómo buscar con la línea de comandos de Linux

Cabe aclarar que ejecutamos el comando anterior un día 26 de mayo al escribir esta guía. Eso explica la razón por la que la búsqueda con find devolvió los archivos resaltados.

Buscar por permisos o propiedad

La expresión -gid GID o -uid UID busca los archivos por identificador de grupo (GID) o de usuario (UID). A pesar de que la opción -group seguida de un nombre localiza los objetos asociados con tal grupo, la opción -gid puede ser útil también. Tal es el caso cuando borramos el grupo y el recurso queda huérfano pero continúa relacionado con el GID. Lo mismo ocurre con -user y -uid, siendo esta última relevante en el cuando removemos una cuenta de usuario.

sudo groupadd prueba # Crear un grupo nuevo...
touch archivo1.txt # ... y un archivo vacío de prueba
sudo chgrp prueba archivo1.txt # Cambiar el grupo propietario
find . -type f -group prueba # Buscar por grupo usando el nombre
ls -l archivo1.txt # Verificar el grupo propietario
grep prueba /etc/group # Buscar el GID del grupo
sudo delgroup prueba # Eliminar el grupo
find . -type f -group prueba # El comando falla al no encontrar el grupo
find . -type f -gid 1001 # Uso del identificador del grupo
como buscar con la linea de comandos de linux 1
Cómo buscar con la línea de comandos de Linux

La imagen de arriba muestra el resultado de los comandos anteriores y la forma de realizar búsquedas por propietario. También es posible encontrar de una sola vez todos los archivos que estén asociados a un grupo o usuario inexistentes:

find . -type f -nogroup # Archivos sin grupo
find . -type d -nouser # Directorios sin propietario

Por otro lado, para identificar archivos que cuenten con un conjunto determinado de permisos utilizaremos la opción -perm seguida de -mode. El ejemplo que aparece a continuación muestra cómo buscar dentro del subdirectorio test todos los archivos en los que tanto el dueño (u), el grupo propietario (g) y el resto de los usuarios del sistema (o) tengan permisos de lectura (r):

mkdir -p test/in1/in2 # Crear una ruta de directorios...
touch test/in1/in2/test.sh # ... y un archivo vacío
find ./test -type f -perm -ugo=r # Buscar dentro del subdirectorio test
ls -l test/in1/in2/test.sh # Verificar los permisos
como buscar con la linea de comandos de linux 2
Cómo buscar con la línea de comandos de Linux

Los permisos también pueden especificarse en forma octal. En ese caso podemos acompañar la opción -perm con el número correspondiente:

find ./test -type f -perm 644 # No hay archivos con rw-r--r--
find ./test -type f -perm 664 # pero sí con rw-rw-r--
como buscar con la linea de comandos de linux 3
Cómo buscar con la línea de comandos de Linux

Buscar por tamaño

Si nos interesa buscar un archivo de un tamaño determinado, usaremos la opción -size seguida de un número n. Normalmente, n se especifica en bloques de 512 bytes pero podemos modificarlo añadiendo una letra al final del valor, como c para bytes, k para kibibytes (KiB o unidades de 1024 bytes), M de megabytes (MiB o unidades de 1048576 bytes), o G de gibibytes (GiB o unidades de 1073741824 bytes). Usualmente, nos interesará buscar archivos mayores o menores que una cantidad determinada. Para eso emplearemos los modificadores + y -, respectivamente:

dd if=/dev/zero of=test/archivo2.iso bs=1M count=5 # Generar un archivo de 5 MB
find ./test -type f -size +3M # Buscar archivos cuyo tamaño sea mayor a 3 MiB
como buscar con la linea de comandos de linux 4
Cómo buscar con la línea de comandos de Linux

Ejecutar acciones sobre los resultados

Además de combinar las distintas opciones, también podemos ejecutar acciones sobre los resultados. Un caso clásico consiste en ubicar los archivos con permisos 777 (lectura, escritura y ejecución para el usuario, el grupo, y todos los usuarios del sistema) y cambiarlos a 664. De no corregirse, esta situación puede resultar perjudicial para el sistema. El motivo es que cualquier persona puede ejecutar comandos arbitrarios desde el interior de un archivo con permisos 777. La clave es utilizar la opción -exec seguida del comando a ejecutar y {} + para representar los resultados de la búsqueda:

chmod 777 test/archivo2.iso # Cambiar los permisos de archivo2.iso
ls -l test/archivo2.iso # Verificar permisos
find ./test -type f -perm 777 -exec chmod 664 {} + # Buscar y realizar acción
ls -l test/archivo2.iso # Chequeo posterior
como buscar con la linea de comandos de linux 6
Cómo buscar con la línea de comandos de Linux

En caso de que find devuelva dos resultados o más, -exec correrá el comando en cuestión sobre cada uno de ellos.

Conclusión

En esta guía aprendiste cómo buscar con la línea de comandos de Linux siguiendo distintos criterios. Con las habilidades que adquiriste, podrás encontrar archivos basándonos en su tamaño, fechas, permisos, tipos y nombres. Además, al ejecutar acciones sobre los resultados tendrás la posibilidad de aumentar la seguridad y la integridad del sistema que tengas a cargo.

Gabriel Cánepa
Gabriel Cánepa

Gabriel trabaja actualmente como desarrollador full-stack en Scalar, una firma que se dedica a hacer valuaciones de empresas. Es Administrador de Sistemas certificado por la Fundación Linux y previamente ha escrito un gran número de artículos y contenidos técnicos sobre el tema para: DigitalOcean, Linode, Carrera Linux Argentina y Tecmint.

Tiene una certificación en programación de la Universidad de Brigham Young-Idaho, y está completando las carreras de programador y analista de sistemas en la Universidad Nacional de Villa Mercedes (UNViMe).

En su tiempo libre, Gabriel disfruta leyendo libros de Stephen R. Covey, tocando piano y guitarra, y enseñando conocimientos de programación a su dos hijas.