Linux find comando
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.
- Domina el mercado con nuestra oferta 3x1 en dominios
- Tu dominio protegido con SSL Wildcard gratis
- 1 cuenta de correo electrónico por contrato
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>
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>
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 exacto y 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
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.
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 {} \;