我正在尝试搜索给定特定字符串/正则表达式值的所有文件。因此,如果我要搜索名称中包含“hello”的所有文件,我该怎么做呢?更复杂的是,我如何找到一个名称以任意两个字母开头,后跟破折号和数字的文件?
我尝试过 find 命令,这对 hello 的情况有所帮助。我只想输入,find <dir> *hello*
但这不适用于正则表达式值。
如果我输入find -E <dir> -regex '^[a-z]{2}-[1-9]'
什么也不会发生。即使我输入find -E <dir> -regex '*[0-9]*'
,也不会发生任何事情。
有人可以帮我解决这个问题吗?提前致谢
答案1
-regex
匹配整个文件路径(不仅仅是名称),并且默认情况下(^
和$
隐式)锚定。
在这里,您不需要正则表达式,您可以使用-name
采用通配符模式并匹配文件名而不是路径的标准:
find . -name '*hello*' -name '[[:alpha:]][[:alpha:]]-[1-9]*'
对于以 2 个字母、一个连字符和 1 到 9 的数字开头且包含“hello”的文件名。
使用正则表达式,这里使用 FreeBSD/OS/X find
,这必须是:
find -E . -regex '.*hello[^/]*' -regex '.*/[[:alpha:]]{2}-[1-9][^/]*'
您需要[^/]*
而不是其他方式,例如.*
,它会匹配。./aa-9/hello/foo/bar
无论如何,find <dir> *hello*
它不会做你认为它会做的事情。 shell 将该*hello*
glob 扩展为当前目录中名称包含“hello”的非隐藏文件或目录列表,并将结果作为额外参数传递给find
.
答案2
那失败了,因为*[0-9]*
是glob 而不是正则表达式。在 glob 中,*
表示“0 个或多个字符”。然而,在正则表达式中,*
意思是“* 之前的 0 个或多个”。换句话说,*
是一个量词
并且只有在量化某些东西时才有意义。
因此,匹配 0 个或多个字符,然后匹配 0 个或多个数字的正则表达式是.*[0-9]*
。此外,当使用-regex
with时find
,正则表达式会与文件的整个 pat 进行匹配,因此您需要考虑到这一点。将所有这些放在一起,您正在寻找的是:
find /path/to/dir -regex '.*/[a-z][a-z]-[1-9].*'
最后,在将此类结构传递给 find 时必须始终引用它们。如果不这样做,shell 将在*
将它们传递到find
.