38

我使用ls -l *.filetype | wc -l但它只能在当前目录中找到文件。
我怎样才能计算其子目录中具有特定扩展名的所有文件?
非常感谢。

4

2 回答 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"

注意:在运行上述复合命令之前:

  1. 首先,cd到您要计算所有具有特定扩展名的文件的目录。
  2. 酌情更改filetype零件,例如txt

演示:

为了进一步说明为什么管道findto的结果wc -l可能会产生不正确的结果:

  1. 运行以下复合命令以快速创建一些测试文件:

    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"中,即问号表示多行文件名中的换行符

  2. 然后运行以下命令将结果通过管道find传输到wc -l

    find ~/Desktop/test -name "*.txt" | wc -l
    

    错误地报告/打印:

    6

  3. 然后运行以下建议的复合命令:

    total=0; while read -rd ''; do ((total++)); done < <(find ~/Desktop/test -name "*.txt" -print0) && echo "$total"
    

    正确报告/打印:

    4

于 2019-12-11T12:55:11.903 回答