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 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 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 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 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 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 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 -lconta a coisa errada. Ele nunca entra nas subpastas, conta diretórios e pula os arquivos ocultos. Quem responde à sua pergunta é ofind -type f.wc -lquebra 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.gitjá 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
- Tamanho das pastas, das maiores para as menores
- Encontrar arquivos duplicados
- grep recursivo pulando node_modules
O CliAI transforma "quantos arquivos por tipo" no pipeline inteiro e mostra ele antes de rodar. Instale em uma linha.