我有一些图像命名与生成uuid1字符串。例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。我想用“find”命令找到所有这些图像:

find . -regex "[a-f0-9\-]\{36\}\.jpg".

但这并不奏效。正则表达式有问题吗?有人能帮我一下吗?


当前回答

从其他答案来看,这似乎是find的错。

但是你可以这样做:

找到。* | grep - p "[a-f0-9\-]{36}\.jpg"

您可能需要稍微调整grep,并根据需要使用不同的选项,但它是有效的。

其他回答

尝试使用单引号(')来避免字符串的shell转义。记住,表达式需要匹配整个路径,即需要看起来像:

 find . -regex '\./[a-f0-9-]*.jpg'

除此之外,我的find (GNU 4.4.2)似乎只知道基本的正则表达式,尤其是{36}语法。我想你只能将就着不戴了。

如果您想保持跨平台兼容性,我发现没有内置的正则表达式搜索选项可以在不同版本的find中以一致的方式工作。

与grep结合

正如@yarian所建议的,你可以运行一个包含过度的查找,然后通过grep运行输出:

找到。| grep -E '<POSIX正则表达式>'

这可能比较慢,但如果你需要使用完整的正则表达式,并且不能将搜索重新格式化为glob,则可以为你提供跨平台的正则表达式搜索

重写为一个glob

name选项与提供有限(但跨平台)模式匹配的glob兼容。

您可以在命令行上使用所有的模式,如* ?{} * *。尽管没有完整的regex那么强大,但您可能能够根据您的用例将搜索重新制定为glob。

网上搜索globs -网上有许多详细介绍全部功能的教程

regex find表达式匹配整个名称,包括当前目录的相对路径。为了寻找。它总是以。/开头,然后是任何目录。

此外,这些是emacs正则表达式,它们具有与通常的egrep正则表达式不同的其他转义规则。

如果这些都直接在当前目录中,那么

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'

应该工作。(我不是很确定——我不能让计数重复在这里工作。)您可以通过-regextype posix-egrep切换到egrep表达式:

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'

(请注意,这里所说的一切都是GNU的,我不知道BSD的任何东西,这也是Mac的默认设置。)

当使用正则表达式应用查找指令时,应该使用绝对目录路径。 在你的例子中,

find . -regex "[a-f0-9\-]\{36\}\.jpg"

应该改为

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

在大多数Linux系统中,正则表达式中的某些规则不能被该系统识别,因此必须显式地指出-regexty like

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"

有一件事我没有看到涉及的是如何结合正则表达式和正则查找语法。

例如:我想在BSD / Linux上找到核心转储文件,我改变到我想扫描的根目录。CD /然后执行:

find \( -path "./dev" -o -path "./sys" -o -path "./proc" \) -prune -o -type f -regextype sed -regex ".*\.core$" -exec du -h {} \; 2> /dev/null

因此,我使用prune命令来排除多个系统目录,然后对剩余的文件进行正则表达式。删除任何错误输出(stderr)。

重要的部分是首先使用Find语法,然后对正则表达式使用OR (-o)。