Cómo utilizar las funciones Buscar y Localizar para buscar archivos en Linux

Introducción
Uno de los problemas con los que se encuentran los usuarios cuando aprenden a trabajar con Linux es cómo encontrar los archivos que buscan.
Esta guía explicará cómo utilizar el find
comando ap, que lleva ese nombre de forma tan acertada. Esto le ayudará a buscar archivos en su sistema utilizando una variedad de filtros y parámetros. También se explicará brevemente el locate
comando, que se puede utilizar para buscar archivos de una manera diferente.
Prerrequisitos
Para seguir esta guía, necesitarás tener acceso a una computadora que ejecute un sistema operativo basado en Linux. Puede ser un servidor privado virtual al que te hayas conectado mediante SSH o tu máquina local. Ten en cuenta que este tutorial se validó con un servidor Linux que ejecuta Ubuntu 20.04, pero los ejemplos que se dan deberían funcionar en una computadora que ejecute cualquier versión de cualquier distribución de Linux.
Si planea utilizar un servidor remoto para seguir esta guía, le recomendamos que primero complete nuestra guía de configuración inicial del servidor . Al hacerlo, obtendrá un entorno de servidor seguro (que incluye un usuario no root con sudo
privilegios y un firewall configurado con UFW) que puede utilizar para desarrollar sus habilidades en Linux.
Nota : Para ilustrar cómo funcionan los comandos find
y locate
, los comandos de ejemplo de esta guía buscan archivos almacenados en /
, o en el directorio raíz . Por este motivo, si ha iniciado sesión en la terminal como un usuario no root , algunos de los comandos de ejemplo pueden incluir Permission denied
en su salida.
Esto es de esperar, ya que estás buscando archivos dentro de directorios a los que los usuarios habituales normalmente no tienen acceso. Sin embargo, estos comandos de ejemplo deberían funcionar y ser útiles para comprender cómo funcionan estos programas.
Búsqueda por nombre
La forma más obvia de buscar archivos es por su nombre.
Para buscar un archivo por nombre con el find
comando, deberá utilizar la siguiente sintaxis:
- find -name "query"
Esto distinguirá entre mayúsculas y minúsculas, lo que significa que una búsqueda de query
es diferente a una búsqueda de Query
.
Para buscar un archivo por nombre pero ignorar las mayúsculas y minúsculas de la consulta, utilice la -iname
opción:
- find -iname "query"
Si desea encontrar todos los archivos que no siguen un patrón específico, puede invertir la búsqueda con -not
:
- find -not -name "query_to_avoid"
Alternativamente, puedes invertir la búsqueda usando un signo de exclamación ( !
), de la siguiente manera:
- find ! -name "query_to_avoid"
Tenga en cuenta que si usa !
, debe escapar el carácter con una barra invertida ( ) para que el shell no intente interpretarlo antes de
find
poder actuar.
Búsqueda por tipo
Puedes especificar el tipo de archivos que quieres buscar con el -type
parámetro. Funciona de la siguiente manera:
- find -type type_descriptor query
A continuación se muestran algunos de los descriptores que puede utilizar para especificar el tipo de archivo:
f
: archivo regulard
: directoriol
:enlace simbólicoc
:dispositivos de caracteresb
:dispositivos de bloque
Por ejemplo, si desea encontrar todos los dispositivos de caracteres en su sistema, podría emitir este comando:
- find /dev -type c
Este comando busca específicamente solo dispositivos dentro del /dev
directorio, el directorio donde normalmente se montan los archivos de dispositivos en los sistemas Linux:
Output/dev/vcsa5/dev/vcsu5/dev/vcs5/dev/vcsa4/dev/vcsu4/dev/vcs4/dev/vcsa3/dev/vcsu3/dev/vcs3/dev/vcsa2/dev/vcsu2/dev/vcs2. . .
Puede buscar todos los archivos que terminen en .conf
con un comando como el siguiente. Este ejemplo busca archivos coincidentes dentro del /usr
directorio:
- find /usr -type f -name "*.conf"
Output/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf/usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf/usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf/usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf/usr/share/adduser/adduser.conf/usr/share/ufw/ufw.conf/usr/share/popularity-contest/default.conf/usr/share/byobu/keybindings/tmux-screen-keys.conf/usr/share/libc-bin/nsswitch.conf/usr/share/rsyslog/50-default.conf. . .
Nota : El ejemplo anterior combina dos find
expresiones de consulta, a saber, -type f
y -name "*.conf"
. Para que se devuelva cualquier archivo, debe satisfacer ambas expresiones.
Puede combinar expresiones como esta separándolas con la -and
opción, pero como muestra este ejemplo, -and
se implica siempre que incluya dos expresiones. También puede devolver resultados que satisfagan cualquiera de las expresiones separándolas con la -or
opción:
- find -name query_1 -or -name query_2
Este ejemplo encontrará cualquier archivo cuyos nombres coincidan con query_1
o query_2
.
Filtrar por tiempo y tamaño
find
Le ofrece una variedad de formas de filtrar resultados por tamaño y tiempo.
Tamaño
Puede filtrar archivos por su tamaño utilizando el -size
parámetro. Para ello, debe agregar un sufijo especial al final de un valor de tamaño numérico para indicar si está contando el tamaño en términos de bytes, megabytes, gigabytes u otro tamaño. A continuación, se muestran algunos sufijos de tamaño de uso común:
c
:bytesk
:kilobytesM
: megabytesG
:gigabytesb
:bloques de 512 bytes
Para ilustrarlo, el siguiente comando encontrará todos los archivos en el /usr
directorio que tengan exactamente 50 bytes:
- find /usr -size 50c
Para buscar archivos que tengan menos de 50 bytes, puede utilizar esta sintaxis:
- find /usr -size -50c
Para buscar archivos en el /usr
directorio que tengan más de 700 megabytes, puede utilizar este comando:
- find /usr -size +700M
Tiempo
Para cada archivo del sistema, Linux almacena datos de tiempo sobre tiempos de acceso, tiempos de modificación y tiempos de cambio.
-
Hora de acceso : la última vez que se leyó o escribió un archivo.
-
Hora de modificación : la última vez que se modificó el contenido del archivo.
-
Hora de cambio : la última vez que se cambiaron los metadatos del inodo del archivo.
Puede basar sus find
búsquedas en estos parámetros utilizando las opciones -atime
, -mtime
y -ctime
, respectivamente. Para cualquiera de estas opciones, debe pasar un valor que indique cuántos días del pasado desea buscar. De manera similar a las opciones de tamaño descritas anteriormente, puede anteponer estas opciones con los símbolos más o menos para especificar “mayor que” o “menor que”.
Por ejemplo, para buscar archivos en el /usr
directorio que se modificaron durante el último día, ejecute el siguiente comando:
- find /usr -mtime 1
Si desea archivos a los que se accedió hace menos de un día, puede ejecutar este comando:
- find /usr -atime -1
Para encontrar archivos cuya metainformación haya cambiado por última vez hace más de 3 días, puedes ejecutar lo siguiente:
- find /usr -ctime +3
Estas opciones también tienen parámetros complementarios que puedes usar para especificar minutos en lugar de días:
- find /usr -mmin -1
Esto proporcionará los archivos que han sido modificados en el último minuto.
find
También puede hacer comparaciones con un archivo de referencia y devolver aquellos que sean más nuevos:
- find / -newer reference_file
Esta sintaxis devolverá todos los archivos del sistema que se crearon o modificaron más recientemente que el archivo de referencia.
Búsqueda por propietario y permisos
También puede buscar archivos por el usuario o el grupo propietario del archivo utilizando los parámetros -user
y -group
, respectivamente. Para buscar todos los archivos del /var
directorio que son propiedad del usuario syslog, ejecute este comando:
- find /var -user syslog
De manera similar, puede especificar archivos en el /etc
directorio propiedad del grupo shadow escribiendo:
- find /etc -group shadow
También puede buscar archivos con permisos específicos.
Si desea que coincida con un conjunto exacto de permisos, puede utilizar esta sintaxis que especifica los permisos mediante notación octal:
- find / -perm 644
Esto hará coincidir los archivos con exactamente los permisos especificados.
Si desea especificar algo con al menos esos permisos, puede preceder la notación de permisos con un signo menos:
- find / -perm -644
Esto coincidirá con cualquier archivo que tenga permisos adicionales. 744
En este caso, se buscará un archivo con permisos de .
Filtrado por profundidad
En esta sección, creará una estructura de directorio de ejemplo que luego usará para explorar el filtrado de archivos por su profundidad dentro de la estructura.
Si sigue los ejemplos de este tutorial, sería prudente crear estos archivos y directorios dentro del /tmp/
directorio. /tmp/
es un directorio temporal , lo que significa que todos los archivos y directorios que se encuentren dentro de él se eliminarán la próxima vez que se inicie el servidor. Esto será útil para los fines de esta guía, ya que puede crear tantos directorios, archivos y enlaces como desee sin tener que preocuparse de que obstruyan su sistema más adelante.
Después de ejecutar los comandos de esta sección, su /tmp/
directorio contendrá tres niveles de directorios, con diez directorios en el primer nivel. Cada directorio (incluido el directorio temporal) contendrá diez archivos y diez subdirectorios.
Cree la estructura de directorio de ejemplo dentro del /tmp/
directorio con el siguiente comando:
- mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
A continuación, rellene estos directorios con algunos archivos de muestra utilizando el touch
comando:
- touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
Con estos archivos y directorios en su lugar, continúe y navegue hasta el test/
directorio que acaba de crear:
- cd /tmp/test
Para obtener una idea básica de cómo find
se recuperarán los archivos de esta estructura, comience con una búsqueda de nombre normal que coincida con cualquier archivo llamado file1
:
- 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. . .
Esto devolverá muchos resultados. Si envía la salida a un contador, verá que hay 1111
resultados totales:
- find -name file1 | wc -l
Output1111
Probablemente, estos resultados sean demasiados para que le resulten útiles en la mayoría de las circunstancias. Para limitarlos, puede especificar la profundidad máxima de la búsqueda en el directorio de búsqueda de nivel superior:
- find -maxdepth num -name query
Para buscar file1
solo en los level1
directorios y superiores, puede especificar una profundidad máxima de 2 (1 para el directorio de nivel superior y 1 para los level1
directorios):
- 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
Ésta 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
Puede usar esto para encontrar solo los archivos al final de las ramas del directorio:
- find -mindepth 4 -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. . .
Nuevamente, debido a la estructura del directorio de ramificación, esto devolverá una gran cantidad 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 file1
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. . .
Al combinar estas opciones de esta manera, los resultados se reducen significativamente, y solo se devuelven 110 líneas en lugar de las 1000 anteriores.
Ejecución de comandos sobre findresultados
Puede ejecutar un comando auxiliar arbitrario en todo lo que find
coincida utilizando el -exec
parámetro usando la siguiente sintaxis:
- find find_parameters -exec command_and_options {} ;
El {}
se utiliza como marcador de posición para los archivos que find
coinciden. El ;
permite find
saber dónde termina el comando.
Por ejemplo, suponiendo que todavía estás en el test/
directorio que creaste dentro del /tmp/
directorio en el paso anterior, podrías encontrar los archivos en la sección anterior que tenían 644
permisos y modificarlos para que tengan 664
permisos:
- find . -type f -perm 644 -exec chmod 664 {} ;
También puedes cambiar los permisos del directorio de manera similar:
- find . -type d -perm 755 -exec chmod 700 {} ;
Este ejemplo busca todos los directorios con permisos establecidos en 755
y luego modifica los permisos a 700
.
Encontrar archivos usandolocate
Una alternativa al uso de este comando find
es el locate
comando. Este comando suele ser más rápido y permite buscar en todo el sistema de archivos con facilidad.
Puede instalar el comando en Debian o Ubuntu apt
actualizando sus listas de paquetes y luego instalando el mlocate
paquete:
- sudo apt update
- sudo apt install mlocate
En Rocky Linux, CentOS y otras distribuciones derivadas de RedHat, puedes utilizar el dnf
comando para instalar mlocate
:
- sudo dnf install mlocate
El motivo locate
es que es más rápido find
porque se basa en una base de datos que enumera todos los archivos del sistema de archivos. Esta base de datos se actualiza normalmente una vez al día con un script cron, pero puedes actualizarla manualmente con el updatedb
comando. Ejecuta este comando ahora con sudo
privilegios:
- sudo updatedb
Recuerde que la locate
base de datos debe estar siempre actualizada si desea buscar nuevos archivos. Si agrega nuevos archivos antes de que se ejecute el script cron o antes de ejecutar el updatedb
comando, no aparecerán en los resultados de la consulta.
locate
Permite filtrar resultados de varias maneras. La forma más básica de utilizarlo para buscar archivos es utilizar esta sintaxis:
- locate query
Esto coincidirá con cualquier archivo y directorio que contenga la cadena query
en cualquier parte de su ruta de archivo. Para devolver solo los archivos cuyos nombres contengan la consulta en sí, en lugar de todos los archivos que tengan la consulta en los directorios que conducen a ella, puede incluir la -b
bandera para buscar solo archivos cuyo “nombre base” coincida con la consulta:
- locate -b query
Para obtener locate
solo resultados que aún existen en el sistema de archivos (es decir, archivos que no se eliminaron entre la última updatedb
llamada y la llamada actual locate
), use el -e
indicador:
- locate -e query
Puede recuperar estadísticas sobre la información que locate
ha catalogado utilizando la -S
opción:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db: 21015 directories 136787 files 7727763 bytes in file names 3264413 bytes used to store database
Esto puede ser útil para obtener una comprensión de alto nivel de cuántos archivos y directorios existen en su sistema.
Conclusión
Tanto los comandos find
como locate
son herramientas útiles para buscar archivos en el sistema. Ambos son comandos potentes que se pueden reforzar combinándolos con otras utilidades a través de pipelines, pero usted debe decidir qué herramienta es la adecuada para su situación particular.
Desde aquí, te animamos a que sigas experimentando con find
y locate
. Puedes leer sus respectivas man
páginas para conocer otras opciones que no se tratan en esta guía, y puedes analizar y manipular los resultados de búsqueda incorporándolos a otros comandos como wc
, sort
y grep
.
Deja una respuesta