Вы можете организовать поиск всех файлов, удалить имена файлов, оставив вам строку, содержащую только имя каталога для каждого файла, а затем подсчитать, сколько раз появляется каждый каталог:
find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c
Единственная проблема в том, что у вас есть имена файлов или каталогов, содержащие символ новой строки, что довольно маловероятно. Если вам действительно нужно беспокоиться о новых строках в именах файлов или именах каталогов, я предлагаю вам найти их и исправить, чтобы они не содержали новых строк (и незаметно убедить виновную сторону в их ошибочности).
Если вас интересует количество файлов в каждом подкаталоге текущего каталога, подсчет любых файлов в любых подкаталогах вместе с файлами в непосредственном подкаталоге, тогда я бы адаптировал sed
команду только для печати каталог верхнего уровня:
find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c
Первый шаблон фиксирует начало имени, точку, косую черту, имя до следующей косой черты и косую черту и заменяет строку только первой частью, поэтому:
./dir1/dir2/file1
заменяется на
./dir1/
Вторая замена захватывает файлы непосредственно в текущем каталоге; у них нет косой черты в конце, и они заменяются на ./
. Затем сортировка и подсчет работают только с количеством имен.
./
?