如何使用正则expression式与find命令?

我有一些用生成的uuid1string命名的图像。 例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。 我想用“查找”命令找出所有这些图像:

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

但它不起作用。 正则expression式有什么问题? 有人可以帮我吗?

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

请注意,您需要在开头指定.*/ ,因为find匹配整个path。

例:

 susam@nifty:~/so$ find . -name "*.jpg" ./foo-111.jpg ./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg susam@nifty:~/so$ susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg" ./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg 

我的版本的查找:

 $ find --version find (GNU findutils) 4.4.2 Copyright (C) 2007 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Eric B. Decker, James Youngman, and Kevin Dalley. Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) susam@nifty:~/so$ susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg" find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'. 

-regex查找expression式匹配整个名称 ,包括当前目录的相对path。 find . 这总是以./开头,然后是任何目录。

另外,这些是emacs正则expression式,它们具有比通常的egrep正则expression式更多的其他转义规则。

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

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

应该pipe用。 (我不太确定 – 我不能重复计算在这里工作。)你可以通过-regextype posix-egrep切换到egrepexpression式:

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

(请注意,这里所说的一切都是为了GNU查找,我不知道什么是BSD,也是Mac上的默认设置。)

从其他答案来看,似乎这可能是发现的错。

不过你可以这样做:

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

你可能需要调整一下grep,并根据你想要的使用不同的选项,但是它可以工作。

尝试使用单引号(')来避免shell的string转义。 请记住,expression式需要匹配整个path,即需要看起来像:

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

除此之外,我的find(GNU 4.4.2)似乎只知道基本的正则expression式,特别是不是{36}的语法。 我想你不得不做。

使用正则expression式应用查找指令时,应使用绝对目录path。 在你的例子中,

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

应该改成

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

在大多数的Linux系统中,正则expression式中的一些规则不能被系统识别,所以你必须明确地指出正则expression式

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