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ímbolo | Tipo de archivo |
b | bloques |
c | caracteres |
d | directorio |
f | archivo común |
l | enlace simbólico |
p | tubería con nombre |
s | socket |
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)
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
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
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--
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
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
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.