代码之家  ›  专栏  ›  技术社区  ›  Lokesh Agrawal

在目录列表中递归查找文件

  •  0
  • Lokesh Agrawal  · 技术社区  · 5 年前

    如何递归地计算Linux目录列表中的文件数?

    例子:

    /dog/
      /a.txt
      /b.txt
      /c.ipynb
    
    /cat/
      /d.txt
      /e.pdf
      /f.png
      /g.txt
    
    /owl/
      /h.txt
    

    我想要以下输出:

    5 .txt
    1 .pynb
    1 .pdf
    1 .png
    

    我试过以下方法,但没有成功。

    find . -type f | sed -n 's/..*\.//p' | sort | uniq -c
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   anubhava    5 年前

    这个 find + gawk 可能适用于您:

    find . -type f -print0 |
    awk -v RS='\0' -F/ '{sub(/^.*\./, ".", $NF); ++freq[$NF]} END {for (i in freq) print freq[i], i}'
    

    -print0 在里面 find 处理带有空格和其他特殊全局字符的文件。同样,我们使用 -v RS='\0' 在里面 awk 确保 NUL

        2
  •  1
  •   Timur Shtatland    5 年前

    使用Perl一行程序以您需要的格式生成输出,如下所示:

    find . -type f | perl -pe 's{.*[.]}{.}' | sort | uniq -c | perl -lane 'print join "\t", @F;' | sort -nr
    

    Perl one liner使用以下命令行标志:
    -e
    -n $_
    -p :一次循环输入一行,将其分配给 $_ print $_ 在每次循环迭代之后。
    -l :剥离输入行分隔符( "\n" (默认情况下为on*NIX),并在打印时追加它。
    -a 进入数组 @F 在空格或中指定的正则表达式上 -F 选项。

    另请参见:
    perldoc perlrun : how to execute the Perl interpreter: command line switches
    perldoc perlrequick : Perl regular expressions quick start

        3
  •  1
  •   kvantour    5 年前

    path 具有以下子目录 foo bar , baz , qux quux , gorge 我们要根据扩展名计算文件类型,但只计算子目录, 巴兹 库克斯

    最好的办法就是

    $ find /path/{foo,baz,qux} -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
    

    exec部分只使用了一个简单的 sh 变量替换以打印扩展名。