我使用ls -l *.filetype | wc -l
但它只能在当前目录中找到文件。
我怎样才能计算其子目录中具有特定扩展名的所有文件?
非常感谢。
问问题
26661 次
2 回答
82
您可以使用find
以下命令执行此操作:
find . -name "*.filetype" | wc -l
于 2012-09-29T20:59:42.277 回答
0
以下复合命令虽然有些冗长,但可以保证准确计数,因为它可以正确处理包含换行符的文件名:
total=0; while read -rd ''; do ((total++)); done < <(find . -name "*.filetype" -print0) && echo "$total"
注意:在运行上述复合命令之前:
- 首先,
cd
到您要计算所有具有特定扩展名的文件的目录。 - 酌情更改
filetype
零件,例如txt
演示:
为了进一步说明为什么管道find
to的结果wc -l
可能会产生不正确的结果:
运行以下复合命令以快速创建一些测试文件:
mkdir -p ~/Desktop/test/{1..2} && touch ~/Desktop/test/{1..2}/a-file.txt && touch ~/Desktop/test/{1..2}/$'b\n-file.txt'
这会在您的“桌面”上生成以下目录结构:
test ├── 1 │ ├── a-file.txt │ └── b\n-file.txt └── 2 ├── a-file.txt └── b\n-file.txt
注意:它总共包含四个
.txt
文件。其中两个具有多行文件名,即b\n-file.txt
.在较新版本的 macOS 上,命名的文件
b\n-file.txt
将显示b?-file.txt
在"Finder"中,即问号表示多行文件名中的换行符然后运行以下命令将结果通过管道
find
传输到wc -l
:find ~/Desktop/test -name "*.txt" | wc -l
它错误地报告/打印:
6
然后运行以下建议的复合命令:
total=0; while read -rd ''; do ((total++)); done < <(find ~/Desktop/test -name "*.txt" -print0) && echo "$total"
它正确报告/打印:
4
于 2019-12-11T12:55:11.903 回答