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

Recursively finding files in list of directories

如何递归计算 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

这个find + gawk可能对你有用:

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

find 中使用 -print0 来处理带有空格和其他特殊 glob 字符的文件是安全的。同样,我们在 awk 中使用 -v RS='[=14=]' 来确保 NUL 字节是记录分隔符。

使用 Perl 一行代码以您需要的格式输出,如下所示:

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

Perl 单行代码使用这些命令行标志:
-e : 告诉 Perl 查找内联代码,而不是在文件中。
-n :一次循环输入一行,默认分配给 $_
-p :一次循环输入一行,默认情况下将其分配给 $_ 。在每次循环迭代后添加 print $_
-l : 在执行内联代码之前去除输入行分隔符(默认情况下在 *NIX 上为 "\n"),并在打印时附加它。
-a : 在空格或 -F 选项中指定的正则表达式上将 $_ 拆分为数组 @F

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

假设您有一个已知目录 path,其中包含以下子目录 foobarbazquxquux , gorge 并且我们希望根据扩展名计算文件类型,但仅针对子目录 foobazqux

最好的就是去做

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

exec 部分仅使用简单的 sh 变量替换来打印扩展名。