我为一个转换项目做了一个网站抓取。我想对其中的文件类型进行一些统计 - 例如,400 个.html
文件、100 个.gif
文件等。有什么简单的方法可以做到这一点?它必须是递归的。
编辑:使用 maxschhelpzig 发布的脚本,由于我所抓取的网站的架构,我遇到了一些问题。有些文件的名称带有*.php?blah=blah&foo=bar
不同的参数,因此它将它们全部视为唯一的。因此,可以这么说,解决方案需要考虑*.php*
全部为同一类型。
答案1
您可以使用find
anduniq
为此,例如:
$ find . -type f | sed 's/.*\.//' | sort | uniq -c
16 avi
29 jpg
136 mp3
3 mp4
命令解释
find
递归打印所有文件名sed
从每个文件名中删除前缀直到文件扩展名uniq
假设输入已排序-c
进行计数(如直方图)。
答案2
这个单行似乎是一种相当强大的方法:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
打印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
构建的 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
答案3
答案4
我知道这个线程很旧,但是,这是搜索“bash 计数文件扩展名”时的最佳结果之一。
我遇到了和你一样的问题,并创建了一个类似于 maxschlepzig 的脚本
这是我执行的命令,它递归地计算工作目录中所有文件的扩展名。这会考虑 UPPER 和 LOWER 情况,合并它们,删除误报结果并计算出现次数。
find . -type f \
| tr '[:upper:]' '[:lower:]' \
| grep -E ".*\.[a-zA-Z0-9]*$" \
| sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' \
| sort |
| uniq -c \
| sort -n
如果您想查看更多文档,请点击 github 链接。