例如,想要匹配该目录及其子目录中以.ly
或结尾的所有文件.ily
。到目前为止,find . -name "*.*ly" -print
这是我能得到的最接近的,但这可能会找到我不想要的文件名。
答案1
您可以使用该-o
选项,它是一个“或”选项。
最简单的版本是
find . -name '*.ly' -o -name '*.ily'
这是有效的,因为-print
这是默认操作。
但如果这-print
只是一个例子,那么您可能需要将这两个子句组合在一起
find . \( -name '*.ly' -o -name '*.ily' \) -print
答案2
zsh
glob 有一个**/
递归 globbing 运算符和 glob 限定符,因此可以完成大部分find
可以做的事情。零或一的东西,又名选修的可以在那里做一些事情(|something)
(什么也不做或某物),尽管也有(#cX,Y)
类似于正则{X,Y}
表达式的任意间隔运算符(需要set -o extendedglob
):
print -rC1 -- **/*.(|i)ly(N)
find
与给你一个排序列表、跳过隐藏文件(D
如果需要的话可以使用限定符)、避免./
前缀、使用任意文件名(许多find
实现包括 GNUfind
阻塞非有效文本的文件名)相比,这将具有优势在用户的区域设置中),如果您需要的不仅仅是打印文件列表,通常可以更轻松、更安全地处理文件列表。
答案3
-regex
另一个解决方案是与find
支持它的实现一起使用:
和GNUfind
:
find -regex '.*\.i?ly'
# or the full command
find . -regextype posix-extended -regex '.*\.i?ly'
和BSDfind
:
find -E . -regex '.*\.i?ly'
该-regex
选项与整个路径匹配,并在开始和结束处都锚定,因此您在开始时需要,在结束时.*
不需要。$
?
是一个扩展正则表达式运算符(如 中grep -E
)与前面的原子(此处为 )匹配 0 或 1 个i
。它在基本正则表达式中不可用,因此您需要-E
BSD 中的find
。在 GNU 中find
(至少在当前版本中),默认的正则表达式既不是基本的也不是扩展的正则表达式,而是来自某些古老版本的 emacs 的一些正则表达式变体,其中?
是支持的。所以-regextype posix-extended
在这种情况下这是没有必要的。
不过,后来1\{0,1\}
已作为 ERE 的等效项添加到 BRE 中。?