Сценарий для отображения количества файлов (по типу файлов) в каталоге?

Я хочу показать такую ​​статистику о конкретном каталоге:

$ myscript.sh .c 34265 files .h 17866 files .cbl 1804 files .pco 389 files [...] 

Есть ли инструмент, который может это сделать?

Вот моя попытка:

 find . -name "*.*" | sed -e "s/.*\.//g" | sort -u 

И затем я мог бы печатать для каждого типа find . -name "*.pc" | wc -l find . -name "*.pc" | wc -l find . -name "*.pc" | wc -l но это надоедает, поэтому я написал:

 find . -name "*.*" | sed -e "s/.*\.//g" | sort -u |\ xargs find . -name "*.{}" | wc -l 

К сожалению, я должен что-то упустить, потому что он говорит:

 find: paths must precede expression: as 

(«как» является первым расширением)
Любая идея, что происходит не так?
Есть ли уже инструмент, который делает то, что я хочу (строки с подсчетом инструмента тоже будут в порядке).

Это можно сделать с помощью gawk : проведите свой список имен файлов через следующие (слева как упражнение / я тестировал с ls -1 , но Do not Parse ls ™):

 gawk -F. '1 {exts[$NF]++} END {for (ext in exts){printf "%s: %s files\n", ext, exts[ext]}}' 

Это предполагает, что все, за которым следует период, не является частью расширения, поэтому имена файлов без периода считаются все-расширением. (Я думаю, этого должно быть достаточно, чтобы изменить 1 { на (NF>1) { только для получения файлов с расширениями.

Следующий конвейер печатает каждую отдельную строку на входе, которой предшествует ее счетчик повторов, отсортированный путем уменьшения количества повторов:

 sort | uniq -c | sort -rn 

Таким образом:

 find . -type f -name '?*.*' | sed 's/.*\.//' | sort | uniq -c | sort -rn 
 ls -1 | awk -F. '{if(NF>1)arr[$NF]++;else blnk++}END{for(i in arr)printf(".%s %s file(s)\n",i,arr[i]);printf("<No Extension> %s file(s)\n",blnk)}'