我为转换项目做了一个网站抓取。我想对那里的文件类型进行一些统计——例如,400 个.html
文件、100 个.gif
等。有什么简单的方法可以做到这一点?它必须是递归的。
编辑:使用 maxschelpzig 发布的脚本,由于我抓取的网站架构,我遇到了一些问题。一些文件的名称*.php?blah=blah&foo=bar
带有各种参数,因此它认为它们都是唯一的。所以解决方案需要考虑*.php*
到所有的类型都是相同的,可以这么说。
max*_*zig 112
你可以使用find
anduniq
为此,例如:
$ find . -type f | sed 's/.*\.//' | sort | uniq -c
16 avi
29 jpg
136 mp3
3 mp4
Run Code Online (Sandbox Code Playgroud)
命令说明
find
递归打印所有文件名sed
从每个文件名中删除前缀直到文件扩展名uniq
假设排序输入
-c
进行计数(如直方图)。这种单行似乎是一种相当健壮的方法:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
该find . -type f -printf '%f\n'
打印树中的每个常规文件的基本名称,没有目录。这样就不必担心正则表达式中可能包含.
' 的目录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
Run Code Online (Sandbox Code Playgroud)
来自构建的 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
Run Code Online (Sandbox Code Playgroud)