我有一些图像命名与生成uuid1字符串。例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。我想用“find”命令找到所有这些图像:
find . -regex "[a-f0-9\-]\{36\}\.jpg".
但这并不奏效。正则表达式有问题吗?有人能帮我一下吗?
我有一些图像命名与生成uuid1字符串。例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。我想用“find”命令找到所有这些图像:
find . -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)。
其他回答
尝试使用单引号(')来避免字符串的shell转义。记住,表达式需要匹配整个路径,即需要看起来像:
find . -regex '\./[a-f0-9-]*.jpg'
除此之外,我的find (GNU 4.4.2)似乎只知道基本的正则表达式,尤其是{36}语法。我想你只能将就着不戴了。
简单的方法-你可以在开头指定.*,因为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)
有一件事我没有看到涉及的是如何结合正则表达式和正则查找语法。
例如:我想在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)。
在Mac OS X上(BSD find):与已接受的答案效果相同。
$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"
man find说-E使用扩展正则表达式支持
注意:要匹配完整的路径,需要使用。*/前缀:
为了便于比较,下面是GNU/Linux版本:
$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
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的默认设置。)