Comando find de Linux: cómo encontrar archivos y directorios

El comando find en Linux examina el directorio especificado y sus subelementos para encontrar archivos o directorios que coincidan con condiciones como nombre, tipo o tamaño. Especifica la ubicación de búsqueda y las condiciones juntas, y encierra los patrones de nombre de archivo entre comillas para que el shell no los expanda de antemano.

Formato básico y alcance de búsqueda

En el siguiente formato, la ruta inicial es donde comienza la búsqueda, y las condiciones limitan qué encontrar. La ruta en sí también se incluye en el objetivo de búsqueda. Los ejemplos a continuación están basados en GNU findutils find y Bash.

find PATH EXPRESSION

find . explora el directorio actual y los subdirectorios, y find /etc comienza desde /etc. Si no se especifican condiciones, imprime las rutas y también explora archivos ocultos y directorios ocultos. Los directorios sin permisos pueden mostrar errores de acceso, y su contenido no será buscado.

El siguiente ejercicio crea archivos en un nuevo directorio temporal. Necesitas continuar en el mismo terminal para mantener la variable workdir. Después de imprimir la ruta para verificar la ubicación, ejecuta el ejemplo.

workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"

Buscar por nombre y tipo de archivo

-name coincide con la sensibilidad a mayúsculas y minúsculas en el componente final de la ruta, no en la ruta completa. -iname no distingue entre mayúsculas y minúsculas. Las comillas simples impiden que el shell expanda * antes de pasar el patrón a find.

find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'

El primer comando busca app.conf y .hidden.conf, y el segundo comando también encuentra EXTRA.CONF. El orden de salida puede variar según el entorno. Escribir find /etc *.conf no tiene condición de nombre y puede actuar de manera involuntaria dependiendo de la expansión del shell, así que evítalo. En su lugar, usa find /etc -name '*.conf'.

-type f busca archivos regulares, -type d busca directorios. Si se combinan condiciones, todas deben cumplirse.

find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'

El primer comando muestra solo archivos regulares con extensiones coincidentes, el segundo muestra solo directorios llamados docs. Por defecto, GNU find no sigue enlaces simbólicos en subdirectorios. Para buscar los enlaces en sí, use -type l.

Restringiendo el rango por profundidad y elementos vacíos

-maxdepth 1 busca solo hasta la ruta de inicio y los elementos directamente debajo de ella. Para excluir la ruta de inicio de los resultados, especifique también -mindepth 1. Se recomienda colocar ambas opciones antes de las condiciones en GNU find.

find "$workdir" -mindepth 1 -maxdepth 1 -type d

En la práctica, docs y empty-dir inmediatamente abajo serán mostrados. -empty encuentra archivos regulares vacíos y directorios vacíos, por lo que puede distinguir especificando el tipo que desea.

find "$workdir" -type f -empty
find "$workdir" -type d -empty

Los archivos creados con touch en la práctica están todos vacíos. En el segundo comando, aparece empty-dir. No considere directamente los resultados de búsqueda como objetivos para eliminación; primero, verifique la ruta y las condiciones.

Ejecutando comandos sobre los archivos encontrados

-exec ejecuta comandos sobre los elementos que coinciden. El siguiente ejemplo muestra el conteo de bytes de archivos regulares sin eliminarlos. {} se sustituye por la ruta encontrada, y + agrupa múltiples rutas tanto como sea posible para pasarlas al comando.

find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +

Dado que los archivos de práctica están vacíos, el recuento de bytes de cada archivo se muestra como 0. wc también puede mostrar el total si se reciben varios archivos. Incluso si hay espacios en los nombres de archivo, cada ruta se pasa como un argumento separado. Para ejecutar el comando para cada elemento por separado, puede usar \; en lugar de +.

Antes de combinar los comandos de eliminación o modificación, primero muestre solo las rutas bajo las mismas condiciones y verifique los objetivos y las copias de seguridad. En directorios donde otros usuarios pueden cambiar archivos durante la búsqueda, los objetivos pueden cambiar incluso después de la verificación, por lo que se necesita precaución adicional. Para más detalles, consulte GNU consideraciones de seguridad de find.

Cuando los resultados son diferentes de los esperados

Si no hay resultados, verifique la ruta de inicio, las mayúsculas y minúsculas en el nombre, la extensión y el tipo de archivo en ese orden. También verifique si el patrón estaba entre comillas y si se necesita la ruta completa en lugar de -name. Al buscar en función de la ruta completa, puede usar -path.

Si hay un error de permisos, significa que hay áreas que no se pudieron buscar. Verifique los permisos de acceso necesarios y, al usar privilegios de administrador, limite cuidadosamente el rango de búsqueda y las acciones a ejecutar. Los significados detallados de los patrones de nombre y las opciones se pueden encontrar en explicación de los patrones de nombre de GNU find.