Introducción
Un problema con el que se encuentran los usuarios cuando se enfrentan por primera vez a una máquina Linux es cómo encontrar los archivos que están buscando.
Esta guía cubrirá cómo utilizar el bien llamado comando find
. Esto le ayudará a buscar archivos en su VPS utilizando una variedad de filtros y parámetros. También cubriremos brevemente el comando locate
, que se puede utilizar para buscar archivos de una manera diferente.
Búsqueda por nombre
La forma más obvia de buscar archivos es por nombre.
Para encontrar un archivo por nombre, escriba:
- find -name "query"
Esto será sensible a las mayúsculas y minúsculas, lo que significa que una búsqueda de file
es diferente a una búsqueda de File
.
Para encontrar un archivo por su nombre, pero ignorando las mayúsculas y minúsculas de la consulta, escriba:
- find -iname "query"
Si desea encontrar todos los archivos que no se adhieren a un patrón específico, puede invertir la búsqueda con -not
o !
. Si utiliza !
, debe escapar el carácter para que bash no trate de interpretarlo antes de que find pueda actuar:
- find -not -name "query_to_avoid"
O
- find \! -name "query_to_avoid"
Búsqueda por tipo
Puede especificar el tipo de archivos que desea encontrar con el parámetro -type
. Funciona así:
- find -type type_descriptor query
Algunos de los descriptores más comunes que puedes utilizar para especificar el tipo de archivo son los siguientes:
-
f: archivo regular
-
d: directorio
-
l: enlace simbólico
-
c: dispositivos de caracteres
-
b: dispositivos de bloque
Por ejemplo, si quisiéramos encontrar todos los dispositivos de caracteres de nuestro sistema, podríamos emitir este comando:
- find / -type c
Output/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .
Podemos buscar todos los archivos que terminan en .conf
así:
- find / -type f -name "*.conf"
Output/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .
Filtrar por tiempo y tamaño
Find le ofrece una variedad de maneras de filtrar los resultados por tamaño y tiempo.
Tamaño
Puede filtrar por tamaño con el uso del parámetro -size
.
Agregamos un sufijo al final de nuestro valor que especifica cómo estamos contando. Estas son algunas opciones populares:
-
c: bytes
-
k: Kilobytes
-
M: Megabytes
-
G: Gigabytes
-
b: Bloques de 512 bytes
Para encontrar todos los archivos que tengan exactamente 50 bytes, escriba:
- find / -size 50c
Para encontrar todos los archivos de menos de 50 bytes, podemos utilizar esta forma en su lugar:
- find / -size -50c
Para encontrar todos los archivos de más de 700 Megabytes, podemos usar este comando:
- find / -size +700M
Time
Linux almacena datos de tiempo sobre tiempos de acceso, tiempos de modificación y tiempos de cambio.
-
Tiempo de acceso: La última vez que se leyó o escribió en un archivo.
-
Tiempo de modificación: Última vez que se modificó el contenido del archivo.
-
Hora de cambio: Última vez que se modificaron los metadatos del inodo del archivo.
Podemos utilizarlos con los parámetros -atime
, -mtime
y -ctime
. Estos pueden usar los símbolos de más y menos para especificar mayor que o menor que, como hicimos con el tamaño.
El valor de este parámetro especifica cuántos días atrás se desea buscar.
Para encontrar archivos que tengan una hora de modificación de hace un día, escriba:
- find / -mtime 1
Si queremos archivos a los que se accedió hace menos de un día, podemos escribir:
- find / -atime -1
Para obtener archivos cuya última información meta haya sido modificada hace más de 3 días, escriba:
- find / -ctime +3
También hay algunos parámetros complementarios que podemos utilizar para especificar minutos en lugar de días:
- find / -mmin -1
Esto dará los archivos que han sido modificados tipo el sistema en el último minuto.
Find también puede hacer comparaciones contra un archivo de referencia y devolver los que son más nuevos:
- find / -newer myfile
Búsqueda por propietario y permisos
También puede buscar archivos por el propietario del archivo o el propietario del grupo.
Esto se hace utilizando los parámetros -user
y -group
respectivamente. Encontrar un archivo que es propiedad del usuario «syslog» escribiendo:
- find / -user syslog
De manera similar, podemos especificar los archivos propiedad del grupo «shadow» escribiendo:
- find / -group shadow
También podemos buscar archivos con permisos específicos.
Si queremos coincidir con un conjunto exacto de permisos, usamos esta forma:
- find / -perm 644
Esto coincidirá con archivos con exactamente los permisos especificados.
Si queremos especificar cualquier cosa con al menos esos permisos, puedes usar esta forma:
- find / -perm -644
Esto coincidirá con cualquier archivo que tenga permisos adicionales. Un archivo con permisos de «744» sería comparado en este caso.
Filtrado por profundidad
Para esta sección, crearemos una estructura de directorios en un directorio temporal. Contendrá tres niveles de directorios, con diez directorios en el primer nivel. Cada directorio (incluyendo el directorio temporal) contendrá diez archivos y diez subdirectorios.
Haga esta estructura emitiendo los siguientes comandos:
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- cd ~/test
Siéntase libre de revisar las estructuras de directorios con ls
y cd
para tener una idea de cómo están organizadas las cosas. Cuando haya terminado, vuelva al directorio de prueba:
- cd ~/test
Trabajaremos en cómo devolver archivos específicos de esta estructura. Intentemos primero un ejemplo con una búsqueda regular por nombre, para comparar:
- find -name file1
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .
Hay muchos resultados. Si colocamos la salida en un contador, podemos ver que hay 1111 resultados en total:
- find -name file1 | wc -l
Output1111
Esto es probablemente demasiados resultados para ser útil en la mayoría de las circunstancias. Intentemos reducirlo.
Puede especificar la profundidad máxima de la búsqueda bajo el directorio de búsqueda de nivel superior:
- find -maxdepth num -name query
Para encontrar «archivo1» sólo en los directorios de «nivel1» y superiores, puede especificar una profundidad máxima de 2 (1 para el directorio de nivel superior, y 1 para los directorios de nivel1):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
Esta es una lista mucho más manejable.
También puedes especificar un directorio mínimo si sabes que todos los archivos existen más allá de cierto punto bajo el directorio actual:
- find -mindepth num -name query
Podemos usar esto para encontrar sólo los archivos al final de las ramas del directorio:
- find -mindepth 4 -name file
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .
De nuevo, debido a nuestra estructura de directorios ramificados, esto devolverá un gran número de resultados (1000).
Puede combinar los parámetros de profundidad mínima y máxima para centrarse en un rango estrecho:
- find -mindepth 2 -maxdepth 3 -name file
Output./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .
Ejecución y combinación de comandos de búsqueda
Puede ejecutar un comando de ayuda arbitrario en todo lo que encuentre coincidencias utilizando el parámetro -exec
. Esto se llama así:
- find find_parameters -exec command_and_params {} \;
El {}
se utiliza como marcador de posición para los archivos que encuentran coincidencias. El \;
se utiliza para que find sepa dónde termina el comando.
Por ejemplo, podríamos encontrar los archivos de la sección anterior que tenían permisos 644
y modificarlos para que tengan permisos 664
:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
Entonces podríamos cambiar los permisos del directorio así:
- find . -type d -perm 755 -exec chmod 700 {} \;
Si quiere encadenar diferentes resultados, puede utilizar los comandos -and
o -or
. El -and
se asume si se omite.
- find . -name file1 -or -name file9
Buscar archivos usando Locate
Una alternativa al uso de find
es el comando locate
. Este comando suele ser más rápido y puede buscar en todo el sistema de archivos con facilidad.
Puede instalar el comando en Debian o Ubuntu con apt
:
- sudo apt install mlocate
En CentOS, utilice dnf
en su lugar:
- sudo dnf install mlocate
La razón por la que locate
es más rápido que find
es porque se basa en una base de datos de los archivos del sistema de archivos.
La base de datos se actualiza normalmente una vez al día con un script cron, pero puede actualizarla manualmente escribiendo:
- sudo updatedb
Ejecute este comando ahora. Recuerde que la base de datos debe estar siempre actualizada si desea encontrar archivos recientemente adquiridos o creados.
Para encontrar archivos con locate, simplemente utilice esta sintaxis:
- locate query
Puede filtrar la salida de algunas maneras.
Por ejemplo, para devolver sólo los archivos que contienen la consulta en sí, en lugar de devolver todos los archivos que tienen la consulta en los directorios que conducen a ella, puede utilizar el -b
para buscar sólo el «nombre base»:
- locate -b query
Para que locate sólo devuelva los resultados que todavía existen en el sistema de archivos (que no fueron eliminados entre la última llamada updatedb
y la actual llamada locate
), utilice la bandera -e
:
- locate -e query
Para ver las estadísticas sobre la información que locate ha catalogado, utilice la opción -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Conclusión
Tanto find como locate son buenas formas de encontrar archivos en su sistema. Depende de usted decidir cuál de estas herramientas es apropiada en cada situación.
Buscar y localizar son comandos poderosos que pueden ser reforzados combinándolos con otras utilidades a través de pipelines. Experimente con el filtrado utilizando comandos como wc
, sort
y grep
.