我使用ls -l *.filetype | wc -l
但它只能在当前目录中找到文件
如何计算其子目录中具有特定扩展名的所有文件?
非常感谢你。
答案 0 :(得分:54)
您可以使用find
命令执行此操作:
find . -name "*.filetype" | wc -l
答案 1 :(得分:0)
以下复合命令(尽管有些冗长)可以保证计数准确,因为它正确handles filenames that contain newlines:
total=0; while read -rd ''; do ((total++)); done < <(find . -name "*.filetype" -print0) && echo "$total"
注意:在运行上述复合命令之前:
cd
到要计算其特定扩展名的所有文件的目录。filetype
部分,例如txt
演示:
进一步说明为什么将find
的结果传递到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
的文件将在“ Finder” 中显示为b?-file.txt
,即问号以多行形式表示换行行文件名
然后运行以下命令,将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