搜索目录中的文件

搜索目录中的文件

我正在尝试搜索给定特定字符串/正则表达式值的所有文件。因此,如果我要搜索名称中包含“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]*。此外,当使用-regexwith时find,正则表达式会与文件的整个 pat 进行匹配,因此您需要考虑到这一点。将所有这些放在一起,您正在寻找的是:

find /path/to/dir -regex '.*/[a-z][a-z]-[1-9]‌​.*'

最后,在将此类结构传递给 find 时必须始终引用它们。如果不这样做,shell 将在*将它们传递到find.

相关内容