Cómo usar Find y Locate para buscar archivos en Linux

author
9 minutes, 6 seconds Read

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
Output
1111

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
Output
Database /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.

Similar Posts

Deja una respuesta

Tu dirección de correo electrónico no será publicada.