CLI AI

Contar arquivos de um diretório, recursivo e por tipo

2026-07-25

find . -type f | wc -l conta todos os arquivos abaixo do diretório atual, subpastas incluídas, e deixa de fora os próprios diretórios. O que costuma interessar são os recortes — por extensão e por subpasta — e existe um caso em que o wc -l mente: um nome de arquivo com quebra de linha.

1. Quantos arquivos ao todo

clai
$ clai quantos arquivos existem nesta pasta e em todas as subpastas→ find . -type f | wc -l20

-type f descarta diretórios e links simbólicos, então o número quer dizer alguma coisa. Na mesma pasta, ls | wc -l responde 3: ele só enxerga o nível de cima e conta diretórios como entradas.

2. Separe por extensão

clai
$ clai conte os arquivos por extensão→ find . -type f -name '*.*' | sed 's/.*\.//' | sort | uniq -c | sort -rn      7 jpg      6 py      4 md      1 txt      1 png      1 bin

Essa costuma ser a pergunta por trás da pergunta: do que este diretório é feito. -name '*.*' descarta arquivos sem extensão — sem ele, o sed devolve o nome inteiro.

3. Separe por subpasta

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

Um laço pelos diretórios do primeiro nível, contando recursivamente dentro de cada um. Diretórios ocultos não casam com */, por isso a soma fica menor que o total.

4. Sem os arquivos ocultos

clai
$ clai conte os arquivos pulando os ocultos→ find . -type f -not -path '*/.*' | wc -l18

20 contra 18 — exatamente os dois arquivos com ponto. -not -path '*/.*' também exclui tudo que está dentro de diretórios ocultos como .git, que costuma ser o que você queria.

5. A armadilha: quebra de linha no nome

clai
$ clai conte arquivos com segurança mesmo que os nomes tenham quebras de linha→ find . -type f -printf '.' | wc -c21

Testado com um arquivo cujo nome ocupa duas linhas: find . -type f | wc -l responde 22 no mesmo diretório. O wc -l conta linhas, não arquivos. -printf '.' emite um ponto por arquivo e a conta volta a fechar. A versão portável, sem extensões GNU, é find . -type f -print0 | tr -dc '\0' | wc -c.

6. Arquivos e diretórios numa linha

clai
$ clai mostre quantos arquivos e quantos diretórios existem aqui→ printf 'files: %s\ndirs: %s\n' "$(find . -type f | wc -l)" "$(find . -type d | wc -l)"

-type d conta o diretório atual também, então o número de diretórios é sempre um a mais do que você espera.

Gotchas

  • ls | wc -l conta a coisa errada. Ele nunca entra nas subpastas, conta diretórios e pula os arquivos ocultos. Quem responde à sua pergunta é o find -type f.
  • wc -l quebra com quebras de linha nos nomes. Verificado: 21 arquivos, resposta 22. Se o diretório veio de fora — de usuários, de um zip, de um scraper — conte com -printf '.' ou -print0.
  • find . entra nos diretórios ocultos. Num repositório, só o .git já acrescenta milhares de arquivos ao total. Filtre com -not -path '*/.*' ou o número não significa nada.

Related questions

Como conto só o primeiro nível? find . -maxdepth 1 -type f | wc -l não desce para as subpastas.

Como conto um tipo só? find . -type f -name '*.log' | wc -l. Maiúsculas contam; use -iname quando não devem.

E se eu quiser tamanho em vez de quantidade? du -sh . dá o total e du -h --max-depth=1 | sort -h separa por subpasta.

See also

O CliAI transforma "quantos arquivos por tipo" no pipeline inteiro e mostra ele antes de rodar. Instale em uma linha.