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

use*_*394 81 shell filenames

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

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

max*_*zig 112

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

$ 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 进行计数(如直方图)。

  • 您可以尝试使用不同的 sed 表达式,例如 `sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9] \).*$/\1/'` (3认同)

Gil*_*il' 6

使用 zsh:

print -rl -- **/?*.*(D.:e) | uniq -c |sort -n
Run Code Online (Sandbox Code Playgroud)

模式 **/?*.*以递归方式匹配当前目录及其子目录中具有扩展名的所有文件。该水珠预选赛 Dzsh遍历甚至隐藏目录,并考虑隐藏文件,.只选择常规文件。该修改历史仅保留文件扩展名。print -rl每行打印一个匹配项。uniq -c计算连续的相同项目(glob 结果已经排序)。最后调用sort按使用计数对扩展进行排序。


Gar*_*kle 5

这种单行似乎是一种相当健壮的方法:

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)