我正在尝试使用 find 命令匹配这些文件名:
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
我对 Java-Perl 正则表达式语法相当熟悉。不幸的是,find 仅支持 emacs 和 posix 语法。
即使查看了 emacs 语法,我仍然无法使基本匹配起作用。
find . -regex "^[[:digit:]]+" -- matches nothing
find . -regex "^[[:digit:]]+.*(ALPHA\|BETA)\.jar" -- matches nothing
这在 Java 和 Perl 中非常简单,例如:
ls | grep -P "^\d+.*(ALPHA|BETA)\.jar"
作品。
答案1
使用 posix-awk 或 posix-extended regxtype 来匹配这些文件的正则表达式是:
find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
因为 find -regex 进行匹配,而不是搜索
您可以使用 -regextype 指定正则表达式类型。请参阅 find 实现的手册页以检查支持哪些正则表达式引擎。
示例(无论目录深度如何,都获取文件):
root@smgw:/tmp# ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
one
root@smgw:/tmp# find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
./4702011-10-21CR719557-R85262-ALPHA.jar
./4702011-10-21CR719557-R85262-BETA.jar
移动罐子,确保它们仍然在原处
使用 abs 路径搜索它们
root@smgw:/tmp# find /tmp -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/4702011-10-21CR719557-R85262-BETA.jar
修改深度:
root@smgw:/tmp# mkdir -p x/y/z
root@smgw:/tmp# cp *^C
root@smgw:/tmp# mv *.jar x/y/z/
root@smgw:/tmp# find /tmp -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/x/y/z/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/x/y/z/4702011-10-21CR719557-R85262-BETA.jar
答案2
使用 emacs 样式来匹配你的模式的正则表达式可以是:
".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"
以下是我做的一个简单测试:
abarbosa@SPF-157:~/Temp/test$ ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
whatever.jar
abarbosa@SPF-157:~/Temp/test$ find . -regex ".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"
./4702011-10-21CR719557-R85262-BETA.jar
./4702011-10-21CR719557-R85262-ALPHA.jar
答案3
根据man find
,这是一场整个路径,而不是搜索。因此,您必须使用如下命令:
$ find . -regex .*/[0-9]+.*\.jar
您还可以使用该选项将正则表达式类型更改为 posix-awk、posix-basic、posix-extended 等-regextype
。