在目录列表中递归查找文件
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
,其中包含以下子目录 foo
、bar
、baz
、qux
、quux
, gorge
并且我们希望根据扩展名计算文件类型,但仅针对子目录 foo
、baz
和 qux
最好的就是去做
$ find /path/{foo,baz,qux} -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
exec 部分仅使用简单的 sh
变量替换来打印扩展名。
如何递归计算 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
,其中包含以下子目录 foo
、bar
、baz
、qux
、quux
, gorge
并且我们希望根据扩展名计算文件类型,但仅针对子目录 foo
、baz
和 qux
最好的就是去做
$ find /path/{foo,baz,qux} -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
exec 部分仅使用简单的 sh
变量替换来打印扩展名。