Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 匹配[number-n]-字但不匹配[number]-字的正则表达式_Regex_Linux_Shell - Fatal编程技术网

Regex 匹配[number-n]-字但不匹配[number]-字的正则表达式

Regex 匹配[number-n]-字但不匹配[number]-字的正则表达式,regex,linux,shell,Regex,Linux,Shell,我想创建一个shell脚本,它遍历文件夹并删除与[versionnumber-n]匹配的文件夹,其中n>0 版本号位于一个文件中,该文件的内容如下: MAVEN_VERSION=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-SNAPS

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

版本号位于一个文件中,该文件的内容如下:

MAVEN_VERSION=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
文件列表如下所示

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)
不幸的是,它与两个文件夹都匹配(在上面的示例中)


编辑:点击submit太早了…

使用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

请参见和。

我最后是如何做到的:

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

(之前使用groovy脚本设置并读取$MAVEN_VERSION_服务器)

请显示这些文件夹的示例列表。并展示你是如何列出它们的。我只是无意中点击了提交。。。抱歉是否要删除除1.2.7.0版本之外的所有内容?谢谢您的回答。问题是,数字会随着时间的推移而变化。我把它写在一个文件中,我想从中读取它并删除所有小于该数字的文件夹。这应该放在一个定期运行的脚本中。@MichaelNiemand您可以使用version sort和sed来显示除最新版本以外的所有版本:
ls-1 | sort-V | sed'$d'
当然
find
也适用于此,不仅仅是
ls
,而是您得到了这个概念。如果您需要帮助来明智地删除这些文件,尽管文件名上有空格,请根据它对您的解决方案进行评论,我会给出建议。对我来说,最安全的方法是使用
xargs
find-type d-regex.*SNAPSHOT'| sort-V | sed'$d'.\n'rm fr
您可以尝试
find-type d-regex.*SNAPSHOT'-not name“1.2.7.0-SNAPSHOT”