匹配[number-n] -WORD而不是[number] -WORD的正则表达式

时间:2014-07-29 09:52:30

标签: regex linux shell

我想创建一个shell脚本,它遍历文件夹并删除与[versionnumber-n]匹配的文件夹,其中n> 0

版本号位于文件中,内容如下:

MAVEN_VERSION=1.2.7.0-SNAPSHOT

以下是一个例子:

文件列表就像

drwxrwxr-x  4 jenkins jenkins 4096 Jul 29 10:54 ./
drwxrwxr-x 20 jenkins jenkins 4096 Jul  4 09:20 ../
drwxr-xr-x  2 jenkins jenkins 4096 Jul 23 12:35 1.2.6.0-SNAPSHOT/
drwxr-xr-x  2 jenkins jenkins 4096 Jul 28 23:13 1.2.7.0-SNAPSHOT/
-rw-rw-r--  1 jenkins jenkins  403 Jul 29 10:11 maven-metadata-local.xml
-rw-r--r--  1 jenkins jenkins  403 Jul 28 23:13 maven-metadata-mtx-snapshots.xml
-rw-r--r--  1 jenkins jenkins   40 Jul 28 23:13 maven-metadata-mtx-snapshots.xml.sha1
-rw-r--r--  1 jenkins jenkins  403 Jul 28 23:13 maven-metadata.xml
-rw-r--r--  1 jenkins jenkins   32 Jul 28 23:13 maven-metadata.xml.md5
-rw-r--r--  1 jenkins jenkins   40 Jul 28 23:13 maven-metadata.xml.sha1
-rw-r--r--  1 jenkins jenkins  186 Jul 28 23:13 resolver-status.properties

我希望脚本删除文件夹1.2.6.0-SNAPSHOT /但不是1.2.7.0-SNAPSHOT /。如果有像1.2.5.0-SNAPSHOT / 1.2.4.0-SNAPSHOT /那样的文件夹那么。

我现在所拥有的是:

.*(?!1.2.7.0)(-SNAPSHOT)

不幸的是,这两个文件夹都匹配(在上面的示例中)

编辑:过早点击提交...

2 个答案:

答案 0 :(得分:1)

使用Bash,你可以使用带有扩展路径名扩展的否定。

shopt -s extglob
rm -fr /dir/1.2.!(7).0-SNAPSHOT

干运行示例:

$ ls -1
1.2.10.0-SNAPSHOT
1.2.5.0-SNAPSHOT
1.2.6.0-SNAPSHOT
1.2.7.0-SNAPSHOT
a
$ echo rm -fr 1.2.!(7).0-SNAPSHOT
rm -fr 1.2.10.0-SNAPSHOT 1.2.5.0-SNAPSHOT 1.2.6.0-SNAPSHOT

请参阅Extended Pattern MatchingFilename Expansion

答案 1 :(得分:0)

我最终是如何做到的:

if [ -z "$MAVEN_VERSION_SERVER" ]
then
echo "\$MAVEN_VERSION_SERVER NOT set! \n exiting ..."
else
find /var/lib/jenkins/.m2/repository/de/db/mtxbes -mindepth  1 -type d -regex '.*SNAPSHOT' -not -name $MAVEN_VERSION_SERVER | xargs -d '\n' rm -fr
fi

($ MAVEN_VERSION_SERVER之前设置并使用groovy脚本读取)