Możesz znaleźć wszystkie pliki, usunąć nazwy plików, pozostawiając linię zawierającą tylko nazwę katalogu dla każdego pliku, a następnie policzyć, ile razy pojawia się każdy katalog:
find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c
Jedynym problemem jest to, że masz jakiekolwiek nazwy plików lub nazwy katalogów zawierające znak nowej linii, co jest raczej mało prawdopodobne. Jeśli naprawdę musisz martwić się nowymi wierszami w nazwach plików lub nazwach katalogów, proponuję je znaleźć i naprawić, aby nie zawierały nowych linii (i po cichu przekonać winnego do błędu w ich postępowaniu).
Jeśli jesteś zainteresowany liczbą plików w każdym podkatalogu bieżącego katalogu, licząc wszystkie pliki w dowolnych podkatalogach wraz z plikami w bezpośrednim podkatalogu, dostosowałbym sed
polecenie tylko do drukowania katalog najwyższego poziomu:
find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c
Pierwszy wzór przechwytuje początek nazwy, kropkę, ukośnik, nazwę aż do następnego ukośnika i ukośnik i zastępuje wiersz tylko pierwszą częścią, więc:
./dir1/dir2/file1
jest zastąpiony przez
./dir1/
Drugie zastąpienie przechwytuje pliki bezpośrednio w bieżącym katalogu; nie mają ukośnika na końcu, a te są zastępowane przez ./
. Sortowanie i liczenie działa wtedy tylko na liczbie nazw.
./
?