Búsqueda básica
Ejecutar find
find . # listar todos los archivos recursivamente find /var/log # buscar desde ruta específica find . -name "*.txt" # buscar por nombre find / -name "config" 2>/dev/null # suprimir errores de permisos find dir1 dir2 -name "*.py" # buscar en múltiples directorios
Resumen de sintaxis
find [path...] [tests] [actions]Forma general — rutas, luego tests, luego acciones
pathDirectorio de inicio (por defecto: directorio actual)
testCondición para filtrar archivos (-name, -type, etc.)
actionQué hacer con los resultados (-print, -exec, etc.)
Acción por defecto-print si no se especifica acción
Patrones de nombre
Coincidencia de nombre
find . -name "*.log" # glob con distinción de mayúsculas find . -iname "readme*" # glob sin distinción de mayúsculas find . -name "*.py" -o -name "*.js" # O: archivos Python o JS find . -path "*/src/*.ts" # coincidir con ruta completa find . -regex '.*\.\(py\|js\)' # regex POSIX en ruta completa
Tests de nombre
-name patternNombre base coincide con glob (distingue mayúsculas)
-iname patternNombre base coincide con glob (sin distinguir)
-path patternRuta completa coincide con glob
-ipath patternRuta completa coincide con glob (sin distinguir)
-regex patternRuta completa coincide con expresión regular
-iregex patternRuta completa coincide con regex (sin distinguir)
Filtros de tipo
Filtrar por tipo
find . -type f # solo archivos regulares find . -type d # solo directorios find . -type l # enlaces simbólicos find . -type f -name "*.sh" # combinar tipo + nombre
Tipos de archivo
-type fArchivo regular
-type dDirectorio
-type lEnlace simbólico
-type bDispositivo de bloque
-type cDispositivo de caracteres
-type pTubería con nombre (FIFO)
-type sSocket
-emptyArchivo o directorio vacío
Tamaño y tiempo
Ejemplos de tamaño y tiempo
find . -size +100M # mayor de 100 MB find . -size -1k # menor de 1 KB find . -mtime -7 # modificado en los últimos 7 días find . -mmin -30 # modificado en los últimos 30 minutos find . -newer reference.txt # más reciente que el archivo de referencia
Tests de tamaño y tiempo
-size +/-NcTamaño en bytes (c), kilobytes (k), megabytes (M), gigabytes (G)
-mtime +/-NModificado hace N*24 horas (+más antiguo, -más reciente)
-atime +/-NAccedido hace N*24 horas
-ctime +/-NEstado cambiado hace N*24 horas
-mmin +/-NModificado hace N minutos
-newer fileModificado más recientemente que el archivo
-newermt dateModificado después de la cadena de fecha (GNU)
Permisos
Ejemplos de permisos
find . -perm 644 # permisos exactos: rw-r--r-- find . -perm -u+x # usuario tiene bit de ejecución find . -perm /o+w # otros tienen escritura (cualquier coincidencia) find . -user root # propiedad de root find . -group www-data -type f # propiedad del grupo
Tests de permisos
-perm modeCoincidencia exacta de permisos
-perm -modeTodos los bits especificados están activos
-perm /modeCualquier bit especificado está activo
-user namePropiedad del usuario (nombre o UID)
-group namePropiedad del grupo (nombre o GID)
-nouserSin usuario coincidente en /etc/passwd
-nogroupSin grupo coincidente en /etc/group
Acciones
Ejemplos de acciones
find . -name "*.log" -print # imprimir rutas (por defecto) find . -name "*.tmp" -delete # eliminar archivos coincidentes find . -type f -ls # listado detallado find . -name "*.txt" -print0 # salida delimitada por nulo find . -type f -printf "%p %s\n" # formato personalizado (GNU)
Referencia de acciones
-printImprimir ruta (delimitado por salto de línea)
-print0Imprimir ruta (delimitado por nulo, seguro para xargs)
-lsImprimir detalles del archivo (como ls -dils)
-deleteEliminar archivos coincidentes (implica -depth)
-printf formatFormato de salida personalizado (GNU): %p ruta, %s tamaño, %t tiempo
-fprint fileEscribir rutas en archivo
-quitSalir después de la primera coincidencia
Combinar tests
Operadores lógicos
find . -name "*.py" -type f # Y implícito find . -name "*.py" -a -size +10k # Y explícito find . -name "*.py" -o -name "*.js" # O find . ! -name "*.log" # NO find . \( -name "*.py" -o -name "*.js" \) -type f
Referencia de operadores
expr1 expr2 / expr1 -a expr2Y — ambas deben ser verdaderas (por defecto)
expr1 -o expr2O — cualquiera debe ser verdadera
! expr / -not exprNO — negar la expresión
\( expr \)Agrupar expresiones (escapar paréntesis en shell)
Orden de evaluaciónDe izquierda a derecha; -a tiene mayor precedencia que -o
Exec y eliminación
Ejemplos de exec
find . -name "*.sh" -exec chmod +x {} \; find . -name "*.log" -exec rm {} + find . -type f -exec grep -l "TODO" {} + find . -name "*.bak" -ok rm {} \; # confirmar antes de cada uno find . -name "*.tmp" -print0 | xargs -0 rm
Referencia de exec
-exec cmd {} \;Ejecutar cmd una vez por archivo ({} = ruta del archivo)
-exec cmd {} +Ejecutar cmd con múltiples archivos a la vez (más rápido)
-ok cmd {} \;Como -exec pero pide confirmación
-execdir cmd {} \;Ejecutar cmd desde el directorio del archivo
xargs -0Combinar con -print0 para procesamiento seguro en lote
-deleteEliminar archivos; procesar primero los más profundos
Profundidad y poda
Ejemplos de profundidad y poda
find . -maxdepth 1 -type f # solo directorio actual find . -mindepth 2 -name "*.py" # omitir nivel superior find . -name ".git" -prune -o -print # omitir dirs .git find . -depth -name "*.tmp" -delete # procesar hijos primero
Opciones de profundidad
-maxdepth NDescender como máximo N niveles (0 = solo ruta inicial)
-mindepth NNo aplicar tests en niveles menores que N
-depthProcesar contenidos del directorio antes que el propio directorio
-pruneNo descender en el directorio coincidente
-mount / -xdevNo cruzar límites de sistemas de archivos
-follow / -LSeguir enlaces simbólicos
Patrones comunes
One-liners
find . -name "*.pyc" -delete # limpiar bytecode Python find . -type f -size 0 -delete # eliminar archivos vacíos find . -mtime +30 -name "*.log" -delete # purgar logs antiguos find . -type f -name "*.md" | wc -l # contar archivos Markdown find . -type d -empty -delete # eliminar dirs vacíos
Recetas
Encontrar archivos más grandesfind . -type f -printf '%s %p\n' | sort -rn | head
Encontrar duplicados por nombrefind . -type f | awk -F/ '{print $NF}' | sort | uniq -d
Renombrar extensiónfind . -name '*.txt' -exec rename 's/.txt/.md/' {} +
Encontrar enlaces simbólicos rotosfind . -xtype l
Archivar archivos recientesfind . -mtime -7 -print0 | tar czf recent.tar.gz --null -T -
Buscar en archivos de códigofind . -name '*.py' -exec grep -l 'pattern' {} +