Tente algo assim:
find . -type f | perl -aF/ -lne 'for (my $i=0; $i < @F-1; ++$i) { print join("/",@F[0...$i]); }' | sort | uniq -c
find . -type f
imprime arquivos:
./dir1/subdir2/file8
./dir1/subdir2/file7
./dir1/subdir2/subdir3/file9
./dir1/subdir2/file6
./dir1/file1
...
perl -aF/ -lne 'for (my $i=0; $i < @F-1; ++$i) { print join("/",@F[0...$i]); }'
converte cada nome de arquivo ./a/b/c
em um conjunto de diretórios .
, ./a
, ./a/b
Nota:
não funciona com novas linhas em nomes de arquivos. Você pode usar -print0
em find
, -0
em perl
e colocar contadores para cada diretório em hash.
Editar:
Inspirado pela resposta do @Gilles :
find . -depth -print0 |
perl -0 -ne '
my $depth = tr!/!/!;
for (my $i = $prev_depth; $i <= $depth; ++$i) { $totals[$i] = 0; }
if ( -f $_ ) {
for (my $i = 0; $i <= $depth; ++$i) { ++$totals[$i]; }
} else {
print "$totals[$depth]\t$_\n";
}
$prev_depth = $depth;
'
Funciona bem com novas linhas em nomes de arquivos. Funciona bem com diretórios vazios. Não requer sort | uniq -c
adicional.