CLI AI

Contar archivos de un directorio, recursivo y por tipo

2026-07-25

find . -type f | wc -l cuenta todos los archivos bajo el directorio actual, subcarpetas incluidas, y deja fuera los propios directorios. Lo interesante suele ser el desglose —por extensión y por subcarpeta— y hay un caso en el que wc -l te miente: un nombre de archivo con un salto de línea.

1. Cuántos archivos hay en total

clai
$ clai cuántos archivos hay en esta carpeta y en todas las subcarpetas→ find . -type f | wc -l20

-type f descarta directorios y enlaces simbólicos, así que el número significa algo. ls | wc -l en la misma carpeta responde 3: solo ve el nivel superior y cuenta los directorios como entradas.

2. Desglose por extensión

clai
$ clai cuenta los archivos por extensión→ find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq -c | sort -rn      7 jpg      6 py      4 md      1 txt      1 png      1 bin

Suele ser la pregunta detrás de la pregunta: de qué está hecho este directorio. -name '*.*' deja fuera los archivos sin extensión; sin él, sed te devuelve el nombre completo.

3. Desglose por subcarpeta

clai
$ clai cuenta los archivos de cada subcarpeta→ for d in */; do printf '%5s %s\n' "$(find "$d" -type f | wc -l)" "$d"; done    3 docs/    8 img/    7 src/

Un bucle por los directorios del nivel superior, contando recursivamente dentro de cada uno. Los directorios ocultos no encajan con */, por eso la suma es menor que el total.

4. Sin archivos ocultos

clai
$ clai cuenta los archivos saltando los ocultos→ find . -type f -not -path '*/.*' | wc -l18

20 frente a 18: exactamente los dos archivos con punto. -not -path '*/.*' también excluye todo lo que hay dentro de directorios ocultos como .git, que suele ser lo que querías.

5. La trampa: un salto de línea en el nombre

clai
$ clai cuenta archivos de forma fiable aunque los nombres tengan saltos de línea→ find . -type f -printf '.' | wc -c21

Probado con un archivo cuyo nombre ocupa dos líneas: find . -type f | wc -l responde 22 en ese mismo directorio. wc -l cuenta líneas, no archivos. -printf '.' emite un punto por archivo y la cuenta vuelve a ser correcta. La versión portable sin extensiones GNU es find . -type f -print0 | tr -dc '\0' | wc -c.

6. Archivos y directorios en una línea

clai
$ clai muestra cuántos archivos y cuántos directorios hay aquí→ printf 'files: %s\ndirs: %s\n' "$(find . -type f | wc -l)" "$(find . -type d | wc -l)"

-type d cuenta también el directorio actual, así que el número de directorios siempre es uno más de lo que esperas.

Gotchas

  • ls | wc -l cuenta lo que no es. No entra en las subcarpetas, sí cuenta directorios y se salta los archivos ocultos. Quien responde a tu pregunta es find -type f.
  • wc -l se rompe con saltos de línea en los nombres. Verificado: 21 archivos, respuesta 22. Si el directorio viene de fuera —usuarios, un archivo comprimido, un scraper— cuenta con -printf '.' o -print0.
  • find . entra en los directorios ocultos. En un repositorio, solo .git puede añadir miles de archivos al total. Filtra con -not -path '*/.*' o el número no significa nada.

Related questions

¿Cómo cuento solo el nivel superior? find . -maxdepth 1 -type f | wc -l no baja a las subcarpetas.

¿Cómo cuento un solo tipo de archivo? find . -type f -name '*.log' | wc -l. Las mayúsculas cuentan; usa -iname cuando no deban.

¿Y si quiero el tamaño en vez del número? du -sh . da el tamaño total y du -h --max-depth=1 | sort -h lo desglosa por subcarpeta.

See also

CliAI convierte "cuántos archivos hay por tipo" en la tubería completa y la muestra antes de ejecutarla. Instálalo en una línea.