我想显示有关特定目录的此类统计信息:
$ 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 "*.*" | sed -e "s/.*\.//g" | sort -u |\
xargs find . -name "*.{}" | wc -l
不幸的是我一定错过了一些东西,因为它说:
find: paths must precede expression: as
(“as”是第一个扩展名)
知道出了什么问题吗?
是否已经有一个工具可以实现我想要的功能(计算文件行数的工具也可以)。
答案1
可以通过以下方式完成gawk
:通过以下内容管道传输文件名列表(作为练习/我使用测试ls -1
,但不要解析ls
(tm)):
gawk -F. '1 {exts[$NF]++} END {for (ext in exts){printf "%s: %s files\n", ext, exts[ext]}}'
这假设句点后面的所有内容都不是扩展名的一部分,因此没有句点的文件名被视为全扩展名。 (我认为更改1 {
为(NF>1) {
仅获取具有正确扩展名的文件应该足够了。
答案2
以下管道打印输入中每个不同的行,前面是其重复计数,按重复计数递减排序:
sort | uniq -c | sort -rn
因此:
find . -type f -name '?*.*' | sed 's/.*\.//' | sort | uniq -c | sort -rn
答案3
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)}'