显示目录中文件数量(按文件类型)的脚本?

显示目录中文件数量(按文件类型)的脚本?

我想显示有关特定目录的此类统计信息:

$ 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)}'

相关内容