目录中文件类型的递归统计?

目录中文件类型的递归统计?

我为一个转换项目做了一个网站抓取。我想对其中的文件类型进行一些统计 - 例如,400 个.html文件、100 个.gif文件等。有什么简单的方法可以做到这一点?它必须是递归的。

编辑:使用 maxschhelpzig 发布的脚本,由于我所抓取的网站的架构,我遇到了一些问题。有些文件的名称带有*.php?blah=blah&foo=bar不同的参数,因此它将它们全部视为唯一的。因此,可以这么说,解决方案需要考虑*.php*全部为同一类型。

答案1

您可以使用findanduniq为此,例如:

$ 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

使用 zsh1:

print -rl -- **/?*.*(D.:e) | uniq -c |sort -n

图案 **/?*.*递归匹配当前目录及其子目录中具有扩展名的所有文件。这D 全局限定符让我们zsh甚至可以遍历隐藏目录并考虑隐藏文件,.只选择常规文件。这:e 修饰语仅保留文件扩展名。print -rl每行打印一个匹配项。uniq -c计算连续的相同项目(全局结果已经排序)。最后调用sort按使用计数对扩展进行排序。


¹ 并假设文件扩展名不包含换行符。

答案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 链接。

https://github.com/Hoppi164/list_file_extensions

相关内容