Macos 递归查找与特定模式匹配的所有文件
我需要查找(或者更具体地说,统计)与此模式匹配的所有文件: */foo/*.doc 其中,第一个通配符星号包含数量可变的子目录 那么: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的文件 计算结果的行数(每个文件一行) 这种方法的好处是: 非递归或迭代(无循环) 它很容易阅读,如果你把它包含在脚本中,它也很容易破译(正则表达式有时不是) 更新:
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”的行
- 计算结果的行数(每个文件一行)
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
。但是,如果文件名包含换行符,这仍然会给出错误的计数