我有一些用生成的uuid1字符串命名的图像。例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。我想使用“查找”命令找出所有这些图像:
find . -regex "[a-f0-9\-]\{36\}\.jpg".
但这是行不通的。正则表达式有问题吗?有人可以帮我吗?
我有一些用生成的uuid1字符串命名的图像。例如81397018-b84a-11e0-9d2a-001b77dc0bed.jpg。我想使用“查找”命令找出所有这些图像:
find . -regex "[a-f0-9\-]\{36\}\.jpg".
但这是行不通的。正则表达式有问题吗?有人可以帮我吗?
Answers:
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
请注意,.*/
由于find
与整个路径匹配,因此需要在开头指定。
例:
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'.
"^ ... $"
您的正则表达式周围存在隐式内容。它必须匹配整个结果行。
/
in,.*/
因为可以.*
匹配零个或多个(几乎)任何字符。
\{36\}
valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
-regextype
标志之前的-regex
标志,否则不适用!
该-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上的默认设置。)
posix-egrep
类型适用于我。
-regextype
是GNU find
而不是BSD 的选项(至少不是Mac BSD样的)find
。如果此选项不可用,请确保安装GNU find。如果在Mac上,则可以使用brew包装findutils
。然后可以通过查找gfind
。
从其他答案来看,这似乎是find的错。
但是,您可以用这种方式代替:
find . * | grep -P "[a-f0-9\-]{36}\.jpg"
您可能需要稍微调整grep并根据需要使用不同的选项,但是它可以工作。
find
的-prune
功能,该功能将完全跳过某些目录。通常,这并不是很重要,但是值得一提。
在Mac OS X上(找到BSD):与接受的答案相同,.*/
需要前缀以匹配完整路径:
$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"
man find
说-E
使用扩展的正则表达式支持
-E
在Ubuntu上不可用(在WSL Ubuntu上测试)
简单方法-您可以在开头指定。*,因为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)