Tutorial

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

Published on December 16, 2020
Español
Cómo usar Find y Locate para buscar archivos en Linux

Introducción

Un problema al que los usuarios se enfrentan cuando utilizan por primera vez una máquina Linux es cómo encontrar los archivos que buscan.

En esta guía, se explicará cómo utilizar el comando llamado find de manera adecuada. Eso lo ayudará a buscar archivos en su VPS utilizando diversos filtros y parámetros. También abordaremos brevemente el comando locate, que se puede utilizar para buscar archivos de distinta manera.

Cómo buscar por nombre

La forma más evidente de buscar archivos es por nombre.

Para encontrar un archivo por nombre, escriba lo siguiente:

  1. find -name "query"

Distingue entre mayúsculas y minúsculas, lo que significa que una búsqueda de file será diferente a File.

Para encontrar un archivo por nombre, pero ignorar mayúsculas o minúsculas en la consulta, escriba lo siguiente:

  1. find -iname "query"

Si desea encontrar todos los archivos que no se ajustan a un patrón específico, puede invertir la búsqueda con -not o !. Si utiliza !, debe quitar el carácter de forma que bash no intente interpretarlo antes que find pueda actuar:

  1. find -not -name "query_to_avoid"

o

  1. find \! -name "query_to_avoid"

Cómo buscar por tipo

Puede especificar el tipo de archivos que desea encontrar con el parámetro -type. Funciona de la siguiente manera:

  1. find -type type_descriptor query

A continuación, encontrará algunos de los descriptores más frecuentes que puede utilizar para especificar el tipo de archivo:

  • f: archivo normal

  • 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 en nuestro sistema, podríamos ejecutar el siguiente comando:

  1. 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 como se muestra a continuación:

  1. 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 . . .

Cómo filtrar por fecha y tamaño

Find le proporciona diversas maneras de filtrar resultados por tamaño y fecha.

Tamaño

Puede filtrar por tamaño utilizando el parámetro -size.

Añadimos un sufijo al final de nuestro valor con el que se especifica cómo se cuenta. Estas son algunas opciones populares:

  • c: bytes

  • k: kilobytes

  • M: megabytes

  • G: gigabytes

  • b: bloques de 512 bytes

Para encontrar todos los archivos que son exactamente de 50 bytes, escriba lo siguiente:

  1. find / -size 50c

Para encontrar todos los archivos de menos de 50 bytes, podemos utilizar la siguiente forma:

  1. find / -size -50c

Para encontrar todos los archivos de más de 700 megabytes, podemos utilizar el siguiente comando:

  1. find / -size +700M

Fecha

Linux almacena datos de fecha de las fechas de acceso, fechas de modificación y fechas de cambio.

  • Fechas de acceso: La última vez que se leyó o se escribió un archivo.

  • Fecha de modificación: La última vez que el contenido del archivo se modificó.

  • Fecha de cambio: La última vez que se modificaron los metadatos inode del archivo.

Podemos utilizarlos con los parámetros -atime, -mtime y -ctime. Con estos, se pueden usar los signos de más y menos para especificar mayor o menor que, como hicimos con el tamaño.

Con el valor de este parámetro, se especifica cuántos días atrás le gustaría buscar.

Para encontrar archivos que tengan una fecha de modificación de un día atrás, escriba lo siguiente:

  1. find / -mtime 1

Si queremos archivos a los que se haya accedido hace menos de un día, podemos escribir lo siguiente:

  1. find / -atime -1

Para obtener archivos cuya metainformación se haya modificado hace más de 3 días, escriba lo siguiente:

  1. find / -ctime +3

También existen algunos parámetros complementarios que podemos usar para especificar minutos en vez de días:

  1. find / -mmin -1

Con esto, se mostrarán los archivos que se modificaron en el último minuto en el sistema.

Find también puede hacer comparaciones con un archivo de referencia y mostrar los que son más recientes:

  1. find / -newer myfile

Cómo buscar por propietario y permisos

También puede buscar archivos por su propietario o propietario del grupo.

Para hacerlo, utilice los parámetros -user y -group respectivamente. Busque un archivo que sea propiedad del usuario “syslog” ingresando lo siguiente:

  1. find / -user syslog

De igual manera, podemos especificar archivos que son propiedad del grupo “shadow” escribiendo lo siguiente:

  1. find / -group shadow

También podemos buscar archivos con permisos específicos.

Si queremos que coincida un conjunto exacto de permisos, utilizamos esta forma:

  1. find / -perm 644

Eso relacionará los archivos con los permisos especificados.

Si queremos especificar algún elemento con al menos esos permisos, puede utilizar esta forma:

  1. find / -perm -644

Eso relacionará cualquier archivo que tenga permisos adicionales. En este caso, se relacionaría un archivo con permisos de “744”.

Cómo filtrar por profundidad

Para esta sección, crearemos una estructura de directorio en un directorio temporal. 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 esta estructura ejecutando los siguientes comandos:

  1. cd
  2. mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
  3. touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
  4. cd ~/test

No dude en consultar las estructuras de directorios con ls y cd para entender cómo se organizan los elementos. Cuando termine, regrese al directorio de prueba:

  1. cd ~/test

Trabajaremos en cómo obtener archivos específicos con esta estructura. Para comparar, primero probaremos un ejemplo con una búsqueda de nombre normal:

  1. 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 . . .

Aparecen muchos resultados. Si canalizamos el resultado en un contador, observamos que hay 1111 resultados en total:

  1. find -name file1 | wc -l
Output
1111

Probablemente, sean demasiados resultados para que le resulte útil en la mayoría de los casos. Intentemos reducirlo.

Puede especificar la profundidad máxima de la búsqueda en el directorio de búsqueda de nivel superior:

  1. find -maxdepth num -name query

Para encontrar “file1” solo en los directorios de “level1” y superiores, puede especificar una profundidad máxima de 2 (1 para el directorio de nivel superior y 1 para los directorios de level1):

  1. 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

Esa lista es mucho más manejable.

También se puede especificar un directorio mínimo si sabe que todos los archivos existen a partir de cierto punto en el directorio actual:

  1. find -mindepth num -name query

Podemos utilizarlo para encontrar solo los archivos al final de las ramas de los directorios:

  1. 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 . . .

Una vez más, debido a nuestra estructura de directorio con ramificaciones, obtendremos un gran número de resultados (1000).

Puede combinar los parámetros de profundidad min y max para centrarse en un rango más pequeño:

  1. 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 . . .

Cómo ejecutar y combinar comandos find

Puede ejecutar un comando auxiliar arbitrario en todo lo que se encuentre con find mediante el uso del parámetro -exec. Eso se invoca de la siguiente manera:

  1. find find_parameters -exec command_and_params {} \;

El {} se utiliza como un marcador de posición para los archivos que se encuentren con find. El \; se utiliza para que find sepa dónde termina el comando.

Por ejemplo, podríamos encontrar los archivos en la sección anterior que tenían 644 permisos y modificarlos para que tengan 664 permisos:

  1. cd ~/test
  2. find . -type f -perm 644 -exec chmod 664 {} \;

Luego, podríamos cambiar los permisos del directorio de esta manera:

  1. find . -type d -perm 755 -exec chmod 700 {} \;

Si desea encadenar diferentes resultados, puede usar los comandos -and o -or. Si se omite, se asume el comando -and.

  1. find . -name file1 -or -name file9

Cómo encontrar archivos utilizando Locate

Una alternativa a utilizar find es el comando locate. A menudo, este comando es más rápido y puede realizar una búsqueda en todo el sistema de archivos con facilidad.

Puede instalar el comando en Debian o Ubuntu con apt:

  1. sudo apt install mlocate

En CentOS, utilice dnf en su lugar:

  1. sudo dnf install mlocate

La razón por la que locate es más rápido que find es porque utiliza una base de datos de los archivos en el sistema de archivos.

Normalmente, la base de datos se actualiza una vez al día con una secuencia de comandos de Cron, pero puede actualizarla de forma manual escribiendo lo siguiente:

  1. sudo updatedb

Ejecute ese comando ahora. Recuerde que la base de datos siempre debe estar actualizada si desea encontrar archivos recientemente adquiridos o creados.

Para encontrar archivos con locate, simplemente utilice la siguiente sintaxis:

  1. locate query

Puede filtrar el resultado de alguna manera.

Por ejemplo, para solo obtener archivos que contengan la consulta en sí, en vez de obtener cada archivo que contenga la consulta en los directorios en que se encuentre, puede utilizar el -b solamente para buscar el “nombre de base”:

  1. locate -b query

Para que con locate solo se obtengan resultados que todavía existen en el sistema de archivos (que no se eliminaron entre la última invocación de updatedb y la invocación actual de locate), utilice el indicador -e:

  1. locate -e query

Para ver estadísticas sobre la información que se catalogó con locate, utilice la opción -S:

  1. locate -S
Output
Database /var/lib/mlocate/mlocate.db: 3,315 directories 37,228 files 1,504,439 bytes in file names 594,851 bytes used to store database

Conclusión

Find y locate son buenas maneras de encontrar archivos en su sistema. Le corresponde decidir cuál de estas herramientas es la adecuada para cada situación.

Find y locate son comandos potentes que se pueden reforzar combinándolos con otras utilidades mediante canalizaciones. Experimente con filtros utilizando comandos como wc, sort y grep.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Become a contributor for community

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

DigitalOcean Documentation

Full documentation for every DigitalOcean product.

Resources for startups and SMBs

The Wave has everything you need to know about building a business, from raising funding to marketing your product.

Get our newsletter

Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

New accounts only. By submitting your email you agree to our Privacy Policy

The developer cloud

Scale up as you grow — whether you're running one virtual machine or ten thousand.

Get started for free

Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

*This promotional offer applies to new accounts only.