递归查找与特定模式匹配的所有文件

时间:2014-04-21 23:47:06

标签: macos bash command-line

我需要找到(或更具体地说,计算)与此模式匹配的所有文件:

* /富/ *。doc的

第一个通配符星号包含可变数量的子目录。

4 个答案:

答案 0 :(得分:37)

使用gnu find你可以使用正则表达式(与-name不同)匹配整个路径:

find . -regex '.*/foo/[^/]*.doc'

只计算文件数:

find . -regex '.*/foo/[^/]*.doc' -printf '%i\n' | wc -l

%i格式代码导致find打印inode编号而不是文件名;与文件名不同,inode编号保证不具有换行符等字符,因此计数更可靠感谢@tripleee的建议。)

我不知道这是否适用于OSX。

答案 1 :(得分:9)

怎么样:

find BASE_OF_SEARCH/*/foo -name \*.doc -type f | wc -l

这是做什么的:

  • 从目录BASE_OF_SEARCH /
  • 开始
  • 查看具有目录foo
  • 的所有目录
  • 查找名为* .doc
  • 的文件
  • 计算结果的行数(每个文件一行)

这种方法的好处:

  • 不是递归的也不是迭代的(没有循环)
  • 它易于阅读,如果将其包含在脚本中,则很容易破译(正则表达式有时不是)。

更新:你想要变深吗?确定:

find BASE_OF_SEARCH -name \*.doc -type f | grep foo | wc -l

  • 从目录BASE_OF_SEARCH
  • 开始
  • 查找名为* .doc
  • 的文件
  • 仅显示此结果的行,包括“foo”
  • 计算结果的行数(每个文件一行)

或者,您可以过滤掉文件名中包含“foo”的结果,因为这也会显示这些结果。

答案 2 :(得分:2)

未经测试,但请尝试:

find . -type d -name foo -print | while read d; do echo "$d/*.doc" ; done | wc -l

找到所有" foo"目录(在不同的深度)(这会忽略符号链接,如果你可以添加它们的问题的一部分);使用shell globbing来查找所有" .doc"文件,然后计算它们。

答案 3 :(得分:2)

基于此页面上其他页面上的答案,我设法将以下内容放在一起,其中在当前文件夹中执行搜索,在其下的所有其他文件中搜索扩展名为 pdf 的所有文件,然后对其标题上包含 test_text 的那些进行过滤。

find . -name "*.pdf" | grep test_text | wc -l