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 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 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 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 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 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 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 -lcuenta lo que no es. No entra en las subcarpetas, sí cuenta directorios y se salta los archivos ocultos. Quien responde a tu pregunta esfind -type f.wc -lse 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.gitpuede 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
- Tamaños de carpetas, de mayor a menor
- Encontrar archivos duplicados
- grep recursivo saltando node_modules
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.