Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 递归查找与特定模式匹配的所有文件_Macos_Bash_Command Line - Fatal编程技术网

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

Macos 递归查找与特定模式匹配的所有文件,macos,bash,command-line,Macos,Bash,Command Line,我需要查找(或者更具体地说,统计)与此模式匹配的所有文件: */foo/*.doc 其中,第一个通配符星号包含数量可变的子目录 那么: find BASE\u OF_SEARCH/*/foo-name\*.doc-type f | wc-l 这是在做什么: 从目录库开始搜索/ 查找所有具有目录foo的目录 查找名为*.doc的文件 计算结果的行数(每个文件一行) 这种方法的好处是: 非递归或迭代(无循环) 它很容易阅读,如果你把它包含在脚本中,它也很容易破译(正则表达式有时不是) 更新:

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

*/foo/*.doc

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

那么:

find BASE\u OF_SEARCH/*/foo-name\*.doc-type f | wc-l

这是在做什么:

  • 从目录库开始搜索/
  • 查找所有具有目录foo的目录
  • 查找名为*.doc的文件
  • 计算结果的行数(每个文件一行)
这种方法的好处是:

  • 非递归或迭代(无循环)
  • 它很容易阅读,如果你把它包含在脚本中,它也很容易破译(正则表达式有时不是)
更新:你想要可变深度?好:

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

  • 从目录库开始搜索
  • 查找名为*.doc的文件
  • 仅显示此结果中包含“foo”的行
  • 计算结果的行数(每个文件一行)
或者,您可以筛选出文件名中包含“foo”的结果,因为这也会显示这些结果。

未测试,但请尝试:

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

查找所有“foo”目录(在不同的深度)(这忽略了符号链接,如果这是问题的一部分,您可以添加它们);使用shell globbing查找所有“.doc”文件,然后对它们进行计数。

使用gnu find可以使用regex,它(与
-name
不同)匹配整个路径:

find . -regex '.*/foo/[^/]*.doc'
要仅计算文件数,请执行以下操作:

find . -regex '.*/foo/[^/]*.doc' -printf '%i\n' | wc -l
(格式化代码
%i
会导致
find
打印inode编号而不是文件名;与文件名不同,inode编号保证不会有换行符,因此计数更可靠。感谢@tripleee的建议。)


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

根据本页其他页面上的答案,我将以下内容放在一起,在当前文件夹及其下的所有其他文件夹中搜索所有扩展名为pdf的文件,然后过滤标题上包含测试文本的文件

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

这是可行的,但它不适用于搜索的BASE_和foo之间的可变子目录深度。也许我对这个规范不够清楚。虽然离我的目标已经很近了,但我还是能够完成我计划要做的任务,所以我要向上投票,谢谢你。你应该强调这不是递归的。然而,这通常是不需要的。那么这是一个简单而好的解决方案。虽然它可能会有性能问题-不知道。我已经为您的请求添加了一个功能。它必须是bash吗?zsh可以使用语法
ls**/foo/*.doc
.Alastair来实现这一点,感谢您的建议。我不知道zsh及其双星号语法。有趣的是,生成的扩展参数列表对于ls(大约6000个文件名)来说似乎太长,并给出了一个错误。Bash v4还支持
**
递归glob。类似
echo
的内部命令避免了
ARG_MAX
问题(参数列表太长)@tripleee Bash v4支持
**
递归glob,但必须首先
shopt-s globstar
。请参见在此结尾附加“| wc-l”,这很完美。只需
-printf'0\n'
?我们根本不需要inode,
while
循环是完全冗余的,并且有点容易出错。此外,通配符将不会展开,因为它被引用。只需将
find-print
传送到
wc-l
。但是,如果文件名包含换行符,这仍然会给出错误的计数