【问题标题】:Regex that matches [number-n]-WORD but not [number]-WORD匹配 [number-n]-WORD 但不匹配 [number]-WORD 的正则表达式
【发布时间】:2014-07-29 09:52:30
【问题描述】:

我想创建一个 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)

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

编辑:只是太早点击提交...

【问题讨论】:

  • 请显示这些文件夹的示例列表。并展示你如何列出它们。
  • 我只是不小心点击了提交...道歉
  • 所以你想删除除 1.2.7.0 版本之外的所有内容?

标签: regex linux shell


【解决方案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

【讨论】:

  • 感谢您的回答。问题是,数字会随着时间而变化。我把它写在一个文件中,我想从中读取它并删除所有小于该数字的文件夹。这应该放在一个定期运行的脚本中。
  • @MichaelNiemand 您可以使用版本排序和 sed 显示除最新版本之外的所有版本:ls -1 | sort -V | sed '$d'
  • 当然find 也适用于此,不仅仅是ls,但你明白了这个概念。如果您需要帮助来明智地删除这些文件,尽管文件名上有空格,请根据它评论您的解决方案,我会提出建议。
  • 对我来说最安全的是使用xargs:find -type d -regex '.*SNAPSHOT' | sort -V | sed '$d' | xargs -d '\n' rm -fr
  • 你可以试试find -type d -regex '.*SNAPSHOT' -not -name '1.2.7.0-SNAPSHOT'
【解决方案2】:

我最后是怎么做到的:

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 脚本设置和读取)

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多