如何将regex与find命令一起使用?

如何将regex与find命令一起使用?,regex,linux,find,Regex,Linux,Find,我有一些用生成的uuid1字符串命名的图像。例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。我想使用“查找”命令查找所有这些图像: 但它不起作用。正则表达式有问题吗?有人能帮我吗?尝试使用单引号(')来避免字符串的shell转义。请记住,表达式需要匹配整个路径,即需要如下所示: find . -regex '\./[a-f0-9-]*.jpg' 除此之外,我的发现(GNU4.4.2)似乎只知道基本的正则表达式,特别是不知道{36}语法。我想没有它你只好将

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

但它不起作用。正则表达式有问题吗?有人能帮我吗?

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

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

除此之外,我的发现(GNU4.4.2)似乎只知道基本的正则表达式,特别是不知道{36}语法。我想没有它你只好将就了

find表达式与全名匹配,包括当前目录的相对路径。对于
查找。
这总是以
/
开始,然后是任何目录

此外,这些是
emacs
正则表达式,它们具有普通egrep正则表达式以外的其他转义规则

如果这些都直接位于当前目录中,则

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'
应该有用。(我不太确定-我无法在这里计算重复次数。)您可以通过
-regextype posix egrep
切换到egrep表达式:

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'
(请注意,这里所说的一切都是为了GNUFind,我对BSD one一无所知,它也是Mac上的默认版本。)

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

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'
例如:

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版本:

$ 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'.
$find--version
find(GNU findutils)4.4.2
版权所有(C)2007免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
作者:埃里克·B·德克、詹姆斯·扬曼和凯文·达利。
使用GNU gnulib版本e5573b1bad88bfabcda181b9e0125fb0c52b7d3b构建
功能启用:D_类型O_NOFOLLOW(启用)叶优化FTS()CBO(级别=0)
susam@nifty:~/so$
susam@nifty:~/so$find-regextype foo-regex“*/[a-f0-9\-]\{36\}\.jpg”
查找:未知的正则表达式类型'foo';有效类型有'findutils default','awk','egrep','ed','emacs','gnu awk','grep','posix awk','posix basic','posix egrep','posix extended','posix minimal basic','sed'。

从其他答案判断,这似乎是find的错

但是,您可以采用以下方式:

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


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

在使用正则表达式应用find指令时,应该使用绝对目录路径。 在您的示例中

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"

简单的方法-您可以在开始时指定。*,因为find匹配整个路径

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'
查找版本

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 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.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)
$find--version
find(GNU findutils)4.6.0
版权所有(C)2015免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
.
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
作者:埃里克·B·德克、詹姆斯·扬曼和凯文·达利。
功能启用:D_类型O_NOFOLLOW(启用)叶优化
FTS(FTS_CWDFD)CBO(2级)
在Mac OS X上(BSD查找)与接受的答案相同,需要使用
*/
前缀来匹配完整路径:

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

manfind
-E
使用扩展正则表达式支持

可能会更改正则表达式类型。默认值是Emacs正则表达式,不管它是什么意思。@Tom这是find中正则表达式的工作方式。根据手册页,正则表达式匹配整个文件路径,包括目录,这意味着正则表达式周围有一个隐式的
“^…$”
。它必须匹配整个结果行。我认为您不需要
*/
中的
/
,因为
*
匹配零个或多个(几乎)任何字符。对于那些(像我一样)第一次没有正确读取正则表达式的人:注意特殊正则表达式字符前面的反斜杠,例如:
\{36\}
我很难找到正则表达式类型的完整列表(手册页不是最新的):
有效的类型有“findutils default”、“awk”、“egrep”、“ed”、“emacs”、“gnu awk”、“grep”、“posix awk”、“posix basic”、“posix egrep”、“posix-extended”、“posix minimal basic”,“sed”。
确保将
-regextype
标志置于
-regex
标志之前,否则它不适用!我的正则表达式中有多个匹配字符串的括号,因此
posix egrep
类型适合我。需要注意的是,
-regextype
是GNU
find
的一个选项,而不是BSD(至少不像Mac BSD那样)
find
。如果此选项不可用,请确保安装GNU find。如果在Mac电脑上,brew软件包
findutils
可以实现此功能。然后可以通过
gfind
找到。regextype posix egrep为我完成了任务。我认为默认的是regextype emacs。对我来说效果很好,并且提供了很大程度的关于regex的自由度。这样做的一个缺点是你不能利用
find
-prune
功能,它将跳过某些目录。大多数情况下,这并不重要,但值得一提。-我想修剪仍然有效。使用-exec会更危险-它会在所有文件上运行,而不仅仅是grep允许通过的文件。似乎
-E
在Ubuntu上不可用(在WSL Ubuntu上测试)@Smart Little Monkey-不,公认的答案应该在Ubuntu上运行,这个变体是专门针对Mac OS X的(或者可能是另一个BSD变体,如FreeBSD)您可以在开头指定。*,因为find匹配整个路径。这是一个非常棘手的好问题
$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"