Linux find: comando para buscar y encontrar archivos en Linux

Linux es un sistema operativo de código abierto que se creó como una alternativa libre a UNIX. Al igual que en UNIX, la línea de comandos es una herramienta fundamental para trabajar en Linux. En ella, el usuario introduce un comando en la línea de comandos que luego se ejecuta.

Para encontrar un archivo en Linux, puedes utilizar el comando Linux find. Esto inicia una búsqueda recursiva en una jerarquía de directorios siguiendo ciertos criterios. El comando find de Linux es una herramienta precisa para encontrar archivos y directorios y es compatible con casi todas las distribuciones de Linux.

Una visión general del comando find de Linux

Para utilizar el comando find en Linux, tendrás que abrir la línea de comandos. Veamos la estructura general del comando find de Linux:

find <directory_path> <search_parameter>
Nota

Atención: ten cuidado con los comandos en la línea de comandos. Si por error ejecutas el comando equivocado, podrás dañar tu sistema.

En primer lugar, se escribe el comando propiamente dicho, seguido de una ruta de directorio y un número variable de parámetros de búsqueda. Un parámetro de búsqueda consiste en un guion que va seguido inmediatamente por el nombre del parámetro. Después un espacio y el valor del parámetro. A continuación, te presentamos un resumen de los parámetros de búsqueda más utilizados:

Parámetro de búsqueda

Explicación

-name, -iname

Filtrar por nombre de archivo

-type

Filtrar por tipo de archivo

-size, -empty

Filtrar por tamaño de archivo

-ctime, -mtime, -atime

Filtrar por marca de tiempo

-user, -group

Filtrar por propietario y grupo

-perm

Filtrar por derechos de archivo

 

También se pueden combinar varios parámetros de búsqueda. Aquí se asume implícitamente una operación lógica AND. Esto puede escribirse explícitamente. Además, se puede utilizar un enlace OR o negar una condición:

Parámetro de búsqueda

Explicación

-and

Los resultados de la búsqueda deben cumplir ambas condiciones

-or

Los resultados de la búsqueda deben cumplir al menos una de las dos condiciones

-not

Negar la condición posterior

Ten en cuenta que debes sustituir los <marcadores de posición> por valores reales en los siguientes ejemplos de código para ejecutar los ejemplos.

Limitar la búsqueda a un directorio específico

Veamos cómo podemos limitar la búsqueda a un directorio específico. Para buscar en el directorio actual, utilizamos el elemento “.” como ruta del directorio:

find . <search_parameter>

Para buscar en tu propia carpeta de usuario, utiliza la tilde “~” como ruta del directorio:

find ~ <search_parameter>

También puedes buscar en todo el sistema con el comando find de Linux. Sin embargo, debido al gran número de archivos y a la posible jerarquía profunda de directorios, esto puede llevar mucho tiempo. Para buscar en todo el sistema, utilizamos una barra diagonal “/” como ruta de acceso al directorio:

find / <search_parameter>
Nota

Atención: ten mucho cuidado al aplicar el Linux find en combinación con el parámetro “-exec” a todo el sistema.

Personalizar la salida de los resultados de la búsqueda

Los resultados de la búsqueda del comando find de Linux pueden ser extensos. Por eso puede ser útil influir en cómo se muestran los resultados. En este caso, es importante no utilizar los parámetros propios del comando, sino hacer uso de las llamadas tuberías. En Linux, son útiles para utilizar la salida de un comando como entrada de otro comando.

Para obtener los resultados página por página, pasamos la salida del comando find al comando less:

find <directory_path> <search_parameter> | less

Para contar el número de resultados, pasamos la salida del comando find al comando wc con el parámetro “-l”:

find <directory_path> <search_parameter> | wc -l

Para ver solo los primeros o losúltimos n resultados de la búsqueda, pasamos la salida del comando find a los comandos “head” y “tail”. En cada caso, especificamos el parámetro “-n” seguido del número deseado de resultados de la búsqueda:

find <directory_path> <search_parameter> | head -n <amount>
find < directory_path> <search_parameter> | tail -n <amount>

Búsqueda de archivos con Linux: casos simples

Los siguientes ejemplos limitan la búsqueda al directorio actual y a cualquier subdirectorio. Utiliza el comando cd en la línea de comandos para cambiar a cualquier directorio. Para probar estos ejemplos, primero cambia a tu carpeta de usuario:

cd ~

Utilizar el comando find de Linux para filtrar por nombre de archivo

Para filtrar por nombres de archivo, utiliza el parámetro “-nombre”. Esto requiere un nombre de archivo exactoy distingue entre mayúsculas y minúsculas:

find . -name <File_Name>

Aquí estamos buscando un archivo con el nombre exacto “.gitignore”.

find . -name .gitignore

Para no diferenciar entre minúsculas y mayúsculas utilizamos el parámetro “-iname”. La “I” aquí significa “insensible”, de “case-insensitive”:

find . -iname <file_name>

Normalmente, es más práctico buscar primero sin distinguir entre mayúsculas y minúsculas y utilizar el parámetro “-nombre” solo si la búsqueda con “-nombre” devuelve demasiados resultados.

Si no queremos buscar un nombre de archivo exacto, sino que queremos utilizar un patrón, utilizamos el asterisco como marcador de posición “comodín” y escribimos el patrón de búsqueda entre comillas (el asterisco se interpreta internamente como “cero hasta que se añadan caracteres adicionales”). En nuestro ejemplo, buscamos archivos y directorios cuyos nombres contengan el texto “git”:

find . -iname “*git*”

Utilizar el comando find de Linux para filtrar por tipo de archivo

Un aspecto famoso de la filosofía UNIX es el principio de que “todo es un archivo” y lo mismo se aplica en Linux. El término “archivo” se refiere a los archivos en un sentido más amplio. En otras palabras, los directorios también se asignan como archivos en Linux. Pero para evitar confusiones, a veces se utiliza el término más preciso “descriptor de archivo”.

Cuando hablamos del “tipo de archivo” en Linux, no estamos hablando de si un documento es un archivo Excel o una imagen JPEG. En su lugar, distinguimos entre los diferentes tipos de descriptores de archivo que existen en Linux. El comando find de Linux nos proporciona el parámetro de búsqueda “-type” para filtrar por tipo de archivo. Por ejemplo, podemos distinguir entre archivos y directorios cuando buscamos. A continuación, hemos resumido los tipos de archivo más utilizados:

Tipo de archivo

Explicación

f

Archivo

d

Directorio

l

Enlace

Para incluir solo los archivos en los resultados de la búsqueda, utilizamos el parámetro “-type” seguido del valor “f”:

find . -type f

Para incluir solo los directorios en los resultados de la búsqueda, utilizamos el parámetro “-type” seguido del valor “d”:

find . -type d

Para filtrar por extensión de archivo, utilizamos el parámetro “-iname” y usamos el asterisco como comodín.

Buscar todos los archivos con la extensión jpeg o JPEG:

find . -type f -iname “*.jpeg”

Buscar todos los archivos con la extensión jpeg/JPEG o jpg/JPG:

find . -type f -iname “*.jpeg” -or -iname “*.jpg”

Utilizar el comando find de Linux para filtrar por tamaño

En Linux, el concepto de archivo vincula varias piezas de información. Esto suele incluir al menos lo siguiente:

  • Nombre
  • Tipo de archivo
  • Tamaño del archivo
  • Marca de tiempo
  • Propietario y grupo
  • Derechos de acceso

Todos ellos pueden filtrarse utilizando el comando find y los parámetros adecuados. Para filtrar por el tamaño de un archivo, utilizamos el parámetro “-size” seguido de una especificación de tamaño.

El siguiente comando find devuelve archivos que tienen un tamaño mínimo de 700 megabytes:

find . -size +700M
Nota

El filtrado por tamaño solo funciona para los archivos. Para los directorios, no se almacena el tamaño en el sistema de datos. En su lugar, el tamaño se puede calcular recursivamente si es necesario.

Las especificaciones de tamaño consisten en un número seguido de una unidad. A continuación, presentamos un resumen de las unidades disponibles:

Unidades

Explicación

c

Bytes

k

Kilobytes

M

Megabytes

G

Gigabytes

b

512-byte bloques

 

La especificación del tamaño se interpreta como el tamaño exacto del archivo. Esto rara vez es práctico, porque a menudo no se conoce el tamaño exacto de un archivo buscado. Lo que sí es práctico es la restricción a un determinado rango de tamaños. Para ello, el número va precedido de un modificador opcional:

Modificador

Explicación

+

El archivo es mayor que el tamaño indicado

-

El archivo es más pequeño que el tamaño indicado

El siguiente comando proporciona archivos de menos de 500 megabytes:

find . -size -500M

El siguiente comando proporciona archivos cuyo tamaño oscila entre 400 y 500 megabytes.

find . -size +400M -and -size -500M

Además de especificar un tamaño exacto o un rango de tamaños, “-empty” es un parámetro independiente para buscar archivos vacíos:

find . -type f -empty

Este comando también funciona para los directorios:

find . -type d -empty

Utilizar el comando find de Linux para filtrar por marca de tiempo

El sistema operativo gestiona el sistema de archivos y registra cuándo se ha accedido a los archivos. En el proceso se generan varias marcas de tiempo. Linux crea marcas de tiempo para la creación, la última modificación y el último acceso a un archivo. Usando el comando find, podemos filtrar y encontrar estas marcas de tiempo. Aquí hay un resumen de los parámetros de búsqueda más utilizados:

Parámetro de búsqueda

Explicación

-ctime, -cmin

Filtrar por fecha de creación

-mtime, -mmin

Filtrar por fecha de modificación

-atime, -amin

Filtrar por fecha de acceso

Para encontrar los archivos que se modificaron hace apenas un día, utilizamos el parámetro de búsqueda “-mtime” seguido del valor “1”:

find . -type f -mtime 1

Los parámetros de búsqueda mostrados con “time” en el nombre interpretan el siguiente valor como el número de días. Los parámetros con “min” en el nombre interpretan el siguiente valor como el número de minutos.

Al igual que al filtrar por tamaño de archivo, aquí también podemos limitar el número de días pasados a un rango. De nuevo, los signos más y menos se utilizan como modificadores:

Modificad0r

Explicación

+

La fecha es de hace más días que la especificada

-

La fecha es de hace menos días que la especificada

Para encontrar archivos creados hace más de 100 días utilizamos el parámetro de búsqueda “-ctime” seguido del valor “+100”:

find . -type f -ctime +100

Al igual que al filtrar por tamaño de archivo, los parámetros de búsqueda pueden combinarse para cubrir un rango. Para encontrar los archivos a los que se accedió hace entre tres y cinco días, utilizamos el parámetro de búsqueda “-atime” dos veces, cada una con los valores “+2” y “-6”. La combinación explícita mediante el parámetro “-and” es opcional:

find . -type f -atime +2 -and -atime -6

Para encontrar los archivos cuyos cambios tienen menos de cinco minutos de antigüedad, utilizamos la búsqueda “-mmin” con el valor “-5”:

find . -type f -mmin -5

Utilizar el comando find de Linux para filtrar por propietario, grupo y derechos de acceso

En Linux, cada archivo tiene asignado un usuario que actúa como propietario. Además, cada archivo pertenece a un determinado grupo de usuarios. En base a esto, se definen ciertos derechos de acceso (permisos) para cada archivo. En base a toda esta información, podemos utilizar el comando find para filtrar y encontrar archivos en Linux. A continuación, presentamos un resumen de los parámetros de búsqueda utilizados:

Parámetro de búsqueda

Explicación

-user

Filtrar por propietario

-group

Filtrar por grupo

-perm

Filtrar por derechos de acceso

Para buscar los archivos propiedad del usuario raíz, utilizamos el parámetro de búsqueda “-user” seguido del valor “root”:

find . -user root

Para buscar los archivos propiedad del propio usuario, utilizamos el parámetro de búsqueda “-user” seguido de la expresión “$(whoami)”. Esta última se resuelve con el nombre del usuario conectado:

find . -user $(whoami)

Para buscar más archivos que pertenezcan al grupo admin, utilizamos el parámetro de búsqueda “-group” seguido del valor “admin”:

find . -group admin

Además de filtrar por propietario y grupo, también es posible filtrar por derechos de acceso. Para ello se utiliza un triplete de números octales. Los valores más frecuentes son “644”, “755”, etc. El primer número define los derechos de acceso para el propietario, el segundo para el grupo y el tercero para otros usuarios. Cada uno de los tres números octales se crea sumando los derechos individuales. Explicamos exactamente cómo funciona esto con más detalle en nuestro artículo sobre la asignación de permisos de directorio con chmod.

Para encontrar archivos totalmente accesibles para cualquier usuario, utilizamos el parámetro de búsqueda “-perm” seguido del valor “777”:

find . -perm 777

Para encontrar archivos a los que solo puede acceder el propietario, utilizamos el parámetro de búsqueda “-perm” seguido del valor “700”:

find . -perm 700

También podemos utilizar el comando find para encontrar archivos en Linux que tengan, como mínimo, los permisos especificados. Para ello, anteponemos inmediatamente el número octal con un signo menos:

find . -perm -007

Limitación de la profundidad de recursión del comando find de Linux

Normalmente, el comando find de Linux recorre recursivamente todos los subdirectorios. Sin embargo, a menudo es útil limitar la profundidad de la recursión. Para ello, utilizamos los parámetros de búsqueda “-maxdepth” y “-mindepth”:

Parámetro de búsqueda

Explicación

-maxdepth

Profundidad máxima de recursión

-mindepth

Profundidad de recursión mínima

Para encontrar los archivos de más de 50 megabytes, incluyendo solo los directorios que no están a más de dos niveles de profundidad que el directorio actual, utilizamos el siguiente comando:

find . -type f -maxdepth 2 -size +50M

Para encontrar los archivos que son mayores de 50 megabytes, incluyendo solo los directorios que están al menos tres niveles y no más de cinco niveles más profundos que el directorio actual, utilizamos el siguiente comando:

find . -type f -mindepth 3 -and -maxdepth 5 -size +50M

Utilizar el comando find de Linux para encontrar y procesar archivos

Hasta ahora nos hemos limitado a encontrar archivos en Linux. Sin embargo, muchos casos requieren un procesamiento masivo de los archivos encontrados. Los escenarios comunes incluyen la reparación de los derechos de acceso para el software basado en la web como WordPress o la eliminación de archivos después de un hackeo. También recurrimos al comando find para estos casos.

A continuación, veamos el patrón general para ejecutar un comando para cada archivo encontrado. Para ello utilizamos el parámetro “-exec”, seguido de un comando Linux y sus parámetros. Todo el comando siempre se termina con el texto constante “{} \;”:

find <directory_path> <find_parameter> -exec <command_and_parameter> {} \;

Ten en cuenta que la ejecución del comando se produce sin preguntar. Dependiendo de los parámetros de búsqueda seleccionados y del comando dado, la ejecución del comando find con el parámetro “-exec” puede causar graves daños al sistema.

Para limitar el riesgo, existe el parámetro “-ok” que es similar al parámetro “-exec”. Esto fuerza la confirmación interactiva del procesamiento de cada archivo individual encontrado:

find <directory_path> <search_parameter> -ok <command_and_parameter> {} \;

Como precaución, limitamos la profundidad de la recursión a un solo subdirectorio mediante “-maxdepth 1” en los siguientes ejemplos.

Nota

Precaución: ten cuidado con los siguientes ejemplos. Te recomendamos encarecidamente que crees tu propia carpeta para probarlos. Cambia a esta carpeta antes de ejecutar los ejemplos para asegurarte de no dañar tu sistema.

Utilizar el comando find de Linux para ajustar el usuario y los grupos

Para establecer el propietario y el grupo de todos los archivos y directorios al valor “www-data” utilizamos el siguiente comando find con el comando chown:

find . -maxdepth 1 -exec chown www-data:www-data {} \;

Utilizar el comando find de Linux para ajustar los derechos de archivos

Para encontrar archivos con derechos “777” y ponerlos en “664” utilizamos el siguiente comando find con el comando chmod:

find . -type f -maxdepth 1 -perm 777 -exec chmod 664 {} \;

Para establecer los permisos de todos los directorios a “755”, utilizamos el siguiente comando find con el comando chmod:

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

Utilizar el comando find de Linux para eliminar directorios y archivos vacíos

También puedes utilizar el comando find para borrar los archivos y directorios encontrados. Como precaución, mostraremos esto aquí solo para archivos y directorios vacíos. Además, en lugar del parámetro “-exec”, utilizamos el parámetro “-ok” para obligar al usuario a aceptar explícitamente el borrado.

Para eliminar todos los directorios de Linux vacíos utilizamos el siguiente comando find junto con el comando rmdir:

find . -type d -maxdepth 1 -empty -ok rmdir {} \;

Para borrar todos los archivos vacíos de Linux, utilizamos el siguiente comando find con el comando rm:

find . -type f -maxdepth 1 -empty -ok rm {} \;

¡No te vayas! ¡Tenemos algo para ti!
Consigue tu dominio .es un año gratis.

Introduce el dominio que deseas en la barra de búsqueda para comprobar su disponibilidad.
12 meses desde 0€/año IVA incl.
después 10 €/año IVA incl.