Цей однолінійний вклад здається досить надійним методом:
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