Этот однострочник кажется довольно надежным методом:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
В find . -type f -printf '%f\n'
печатает BASENAME каждого обычного файла в дереве, без каталогов. Это избавляет от необходимости беспокоиться о каталогах, которые могут быть .
в них в вашем sed
регулярном выражении.
sed -r -n 's/.+(\..*)$/\1/p'
Заменяет входящее имя файла только с его расширением. Например, .somefile.ext
становится .ext
. Обратите внимание на инициал .+
в регулярном выражении; это приводит к тому, что для любого соответствия требуется хотя бы один символ перед расширением .
. Это предотвращает .gitignore
обращение с такими именами файлов , как отсутствие имени и расширение «.gitignore», что, вероятно, вам и нужно. Если нет, то замените .+
с .*
.
Остальная часть строки от принятого ответа.
Изменить : Если вы хотите хорошо отсортированную гистограмму в формате диаграммы Парето , просто добавьте другую sort
в конец:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c | sort -bn
Пример вывода из встроенного дерева исходных текстов Linux:
1 .1992-1997
1 .1994-2004
1 .1995-2002
1 .1996-2002
1 .ac
1 .act2000
1 .AddingFirmware
1 .AdvancedTopics
[...]
1445 .S
2826 .o
2919 .cmd
3531 .txt
19290 .h
23480 .c