Linux en Español

Tutorial del comando find en Linux (con ejemplos)

Cuando se trata de localizar archivos o directorios en su sistema, el comando de búsqueda en Linux no tiene paralelo.  Es simple de usar, pero tiene muchas opciones diferentes que te permiten afinar la búsqueda de archivos.

Sigue leyendo para ver ejemplos de cómo puedes usar este comando para encontrar cualquier cosa en tu sistema. Cada archivo está a sólo unas pocas teclas una vez que sepas cómo usar el comando de búsqueda en Linux.

 

 

Buscar un Directorio

Puedes decirle al comando find que busque específicamente los directorios con la opción -tipo d. Esto hará que el comando de búsqueda sólo busque nombres de directorios que coincidan y no nombres de archivos.

$ find /path/to/search -type d -name "name-of-dir"

Buscar un Directorio

Buscar archivos ocultos

Dado que los archivos y directorios ocultos en Linux comienzan con un punto, podemos especificar este patrón de búsqueda en nuestra cadena de búsqueda para listar recursivamente los archivos y directorios ocultos.

$ find /path/to/search -name ".*"

 

Buscar archivos de cierto tamaño o más grandes que X

La opción -size en find nos permite buscar archivos de un tamaño específico. Puede utilizarse para encontrar archivos de un tamaño exacto, archivos que son más grandes o más pequeños que un cierto tamaño, o archivos que se ajustan a un rango de tamaño especificado. A continuación, se presentan algunos ejemplos:

Buscar archivos más grandes que 10MB en tamaño:

$ find /path/to/search -size +10M

Buscar archivos más pequeños que 10MB en tamaño:

$ find /path/to/search -size -10M

Buscar archivos de exactamente 10MB en tamaño:

$ find /path/to/search -size 10M

Buscar archivos que están entre 100MB y 1GB en tamaño:

$ find /path/to/search -size +100M -size -1G

Buscar de una lista de archivos

Si tiene una lista de archivos (en un archivo .txt, por ejemplo) que necesita buscar, puede buscar su lista de archivos con una combinación de los comandos find y grep. Para que este comando funcione, sólo asegúrese de que cada patrón que desee buscar esté separado por una nueva línea.

$ find /path/to/search | grep -f filelist.txt

La opción -f en grep significa “archivo” y nos permite especificar un archivo de cadena con el que se debe hacer la comparación. Esto resulta en que el comando find devuelve cualquier archivo o nombre de directorio que coincida con los de la lista.

Buscar no en una lista

Utilizando la misma lista de archivos que mencionamos en el ejemplo anterior, también puedes utilizar el comando para buscar cualquier archive que no coincide con los patrones dentro del archive de texto. Una vez más, utilizaremos una combinación de find y el comando grep; solo necesitamos una opción adicional especificada con grep:

$ find /path/to/search | grep -vf filelist.txt

La opción -v en grep significa “coincidencia inversa” y devolverá una lista de archivos que no coinciden con ninguno de los patrones especificados en nuestra lista de archivos.

Establecer la profundidad máxima

El comando find buscará recursivamente por defecto. Esto significa que buscará en el directorio especificado el patrón que usted especificó, así como en todos y cada uno de los subdirectorios dentro del directorio que usted le dijo que buscara.

Por ejemplo, si le dice a find que busque en el directorio raíz de Linux (/), buscará en todo el disco duro, sin importar cuántos subdirectorios de subdirectorios existan. Puedes evitar este comportamiento con la opción -maxdepth.

Especifica un número después de -maxdepth para indicar a find en cuántos subdirectorios debe buscar recursivamente.

Busque los archivos sólo en el directorio actual y no busque de forma recursiva:

$ find . -maxdepth 0 -name "myfile.txt"

Buscar archivos sólo en el directorio actual y un subdirectorio más profundo:

$ find . -maxdepth 1 -name "myfile.txt"

 

Buscar archivos vacíos (longitud- cero)

Para buscar archivos vacíos con find, puedes utilizar la bandera -empty. Busca a todos los archivos vacíos:

$ find /path/to/search -type f -empty

Buscar todos los directorios vacíos:

$ find /path/to/search -type d -empty

También es muy útil acoplar este comando con la opción -delete si quieres borrar automáticamente los archivos o directorios vacíos que son devueltos por find.

Borrar todos los archivos vacíos de un directorio (y subdirectorios):

$ find /path/to/search -type f -empty -delete

 

Buscar el directorio o archivo más grande

Si desea determinar rápidamente qué archivos o directorios de su sistema ocupan más espacio, puede utilizar find para realizar búsquedas recursivas y obtener una lista ordenada de archivos y/o directorios por su tamaño.

Cómo mostrar el archivo más grande de un directorio:

$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | tail -1

Fíjate que el comando find fue ordenado a otras dos utilidades de Linux: ordenar y seguir. El comando sort pondrá la lista de archivos en orden por su tamaño, y el comando tail sólo dará como resultado el último archivo de la lista, que también es el más grande.

Puede ajustar el comando tail si desea obtener, por ejemplo, los 5 archivos más grandes:

$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | tail -5

Alternativamente, podrías usar el comando head para determinar el archivo o archivos más pequeños:

$ find /path/to/search -type f -printf "%s\t%p\n" | sort -n | head -5

Si desea buscar directorios en lugar de archivos, sólo tiene que especificar “d” en la opción de tipo. Cómo mostrar el directorio más grande:

$ find /path/to/search -type d -printf "%s\t%p\n" | sort -n | tail -1

 

Buscar los archivos de configuración setuid

Setuid es una abreviatura de “set user ID on execution”, que es un permiso de archivo que permite a un usuario normal ejecutar un programa con privilegios escalonados (como el root).

Esto puede ser una preocupación de seguridad por razones obvias, pero estos archivos pueden ser fáciles de aislar con el comando find y algunas opciones.

El comando find tiene dos opciones para ayudarnos a buscar archivos con ciertos permisos: -usuario y -perm. Para encontrar archivos que puedan ser ejecutados con privilegios de root por un usuario normal, puede usar este comando:

$ find /path/to/search -user root -perm /4000

Buscar los archivos de configuración setuid

En la captura de pantalla anterior, incluimos la opción -exec para mostrar un poco más de salida sobre los archivos con los que se encuentran los retornos. Todo el comando se ve así:

$ find /path/to/search -user root -perm /4000 -exec ls -l {} \;

También puedes sustituir “root” en este comando por cualquier otro usuario que quieras buscar como propietario. O, podrías buscar todos los archivos con permisos SUID y no especificar un usuario en absoluto:

$ find /path/to/search -perm /4000

 

Buscar archivos de configuración sgid

Encontrar archivos con el conjunto SGID es casi lo mismo que encontrar archivos con el SUID, excepto que los permisos para 4000 deben ser cambiados a 2000:

$ find /path/to/search -perm /2000

También puedes buscar archivos que tengan tanto el SUID como el SGID establecidos especificando 6000 en la opción perms:

$ find /path/to/search -perm /6000

Lista de archivos sin permisos negados

Cuando buscas archivos con el comando de búsqueda, debe tener permisos de lectura en los directorios y subdirectorios en los que esté buscando. Si no lo tiene, find emitirá un mensaje de error, pero continuará buscando en los directorios en los que sí tiene permiso.

Lista de archivos sin permisos negados

Aunque esto podría ocurrir en muchos directorios diferentes, definitivamente ocurrirá cuando busques en tu directorio raíz.

Esto significa que cuando intentes buscar un archivo en todo el disco duro, el comando find producirá un montón de mensajes de error.

Para evitar ver estos errores, puedes redirigir la salida de stderr de find a stdout y canalizarla a grep.

$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"

Este comando usa la opción -v (inversa) de grep para mostrar toda la salida excepto las líneas que dicen “Permiso denegado.”

 

Buscar archivos modificados en los últimos X días

Utilice la opción -mtime del comando de búsqueda para buscar archivos o directorios que hayan sido modificados en los últimos X días. También se puede usar para buscar archivos más antiguos que X días, o archivos que fueron modificados exactamente X días atrás.

A continuación, se muestran algunos ejemplos de cómo utilizar la opción -mtime del comando de búsqueda:

Buscar todos los archivos que fueron modificados en los últimos 30 días:

$ find /path/to/search -type f -mtime -30

Buscar todos los archivos que fueron modificados hace más de 30 días:

$ find /path/to/search -type f -mtime +30

Buscar todos los archivos que fueron modificados exactamente hace 30 días:

$ find /path/to/search -type f -mtime 30

Si quieres que el comando find emita más información sobre los archivos que encuentra, como la fecha de modificación, puedes usar la opción -exec e incluir un comando ls:

$ find /path/to/search -type f -mtime -30 -exec ls -l {} \;

Ordenar por tiempo

Para ordenar los resultados de la búsqueda por el tiempo modificado de los archivos, puedes usar la opción -printf para listar los tiempos de una manera ordenable, y canalizar esa salida a la utilidad de ordenamiento.

$ find /path/to/search -printf "%T+\t%p\n" | sort

Este comando ordenará los archivos más antiguos a los más nuevos. Si desea que los archivos más nuevos aparezcan primero, sólo tiene que pasar la opción -r (inversa) para ordenar.

$ find /path/to/search -printf "%T+\t%p\n" | sort -r

Diferencias entre locate (localizar) y find (encontrar)

El comando locate en Linux es otra buena manera de buscar archivos en su sistema. No está repleto de opciones de búsqueda como lo está el comando find, así que es un poco menos flexible, pero sigue siendo útil.

$ locate myfile.txt

El comando find funciona buscando en una base de datos que contiene todos los nombres de los archivos del sistema. El comando updatedb actualiza esta base de datos.

Como el comando locate no tiene que realizar una búsqueda en vivo de todos los archivos del sistema, es mucho más eficiente que el comando de búsqueda. Pero además de la falta de opciones, hay otro inconveniente: la base de datos de archivos sólo se actualiza una vez al día.

Puedes actualizar esta base de datos de archivos manualmente ejecutando el comando updatedb:

$ updatedb

El comando locate es particularmente útil cuando se necesita buscar un archivo en todo el disco duro, ya que el comando find naturalmente tomará mucho más tiempo, ya que tiene que recorrer cada uno de los directorios en tiempo real.

Si se busca en un directorio específico, que se sabe que no contiene un gran número de subdirectorios, es mejor seguir con el comando find.

 

CPU cargado de comandos find

Cuando se busca a través de un montón de directorios, el comando de búsqueda puede ser intensivo en recursos. Debería permitir intrínsecamente que los procesos más importantes del sistema tuvieran prioridad, pero si necesitas asegurarte de que el comando de búsqueda ocupa menos recursos en un servidor de producción, puedes usar el comando ionice o nice.

Supervisar el uso de la CPU del comando find:

$ top

Reducir la prioridad de entrada/salida del comando find:

$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"

Reducir la prioridad del CPU para el comando find:

$ nice -n 19 find /path/to/search -name "myfile.txt"

O combinar ambas utilidades para asegurar realmente una baja E/S y una baja prioridad de la CPU:

$ nice -n ionice -c2 -n7 find /path/to/search -name "myfile.txt"

 

Espero que el tutorial le sea útil. Sigue viniendo.

Mokhtar Ebrahim
Fundadora de LikeGeeks. Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *