Você pode organizar para localizar todos os arquivos, remover os nomes dos arquivos, deixando uma linha contendo apenas o nome do diretório para cada arquivo e, em seguida, contar o número de vezes que cada diretório aparece:
find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c
O único problema nisso é se você tem nomes de arquivos ou diretórios contendo um caractere de nova linha, o que é bastante improvável. Se você realmente precisa se preocupar com novas linhas em nomes de arquivos ou diretórios, sugiro que os encontre e corrija para que não contenham novas linhas (e silenciosamente persuadir a parte culpada do erro de seus caminhos).
Se você estiver interessado na contagem dos arquivos em cada subdiretório do diretório atual, contando todos os arquivos em quaisquer subdiretórios junto com os arquivos no subdiretório imediato, então eu adaptaria o sed
comando para imprimir apenas o diretório de nível superior:
find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c
O primeiro padrão captura o início do nome, o ponto, a barra, o nome até a próxima barra e a barra, e substitui a linha apenas pela primeira parte, então:
./dir1/dir2/file1
é substituído por
./dir1/
A segunda substituição captura os arquivos diretamente no diretório atual; eles não têm uma barra no final e são substituídos por ./
. A classificação e a contagem funcionam apenas com o número de nomes.
./
?