【问题标题】:Delete all folders except one (or more)删除除一个(或多个)以外的所有文件夹
【发布时间】:2019-06-14 09:10:34
【问题描述】:

我有以下步骤应该删除除foobar 之外的所有文件夹:

node {
    stage('Clean') {
        sh "rm -rf ${WORKSPACE}/path/to/folder/!\\(foobar\\)"
    }
}

它会生成以下命令:

rm -rf '/path/to/workspace/path/to/folder/!(foobar)

它什么都不做。但是,如果我在我的终端(在 Jenkins 之外)中键入命令,而路径周围没有简单的引号,它就可以工作。

为什么 Jenkins 会生成简单的引号?如何删除它们以使命令起作用?

(我在 OSX 上运行 Jenkins)

【问题讨论】:

    标签: bash jenkins sh jenkins-pipeline


    【解决方案1】:

    类型 glob !(name) 不起作用,除非您设置 shopt -s extglob 在 bash 中。

    请尝试:

    bash -O extglob -c "rm -rf /path/to/workspace/path/to/folder/!(foobar)"
    

    你也可以说:

    find /path/to/workspace/path/to/folder -type d -mindepth 1 ! -name "foobar" -print0 | xargs -0 rm -rf
    

    请记得提前做好文件夹备份,以免文件意外丢失。

    【讨论】:

      【解决方案2】:

      要删除工作区(foobar 文件夹除外),您还可以使用 Workspace Cleanup 插件中的 cleanWs() 管道方法。 例如,像这样:

      cleanWs deleteDirs: true, patterns: [[pattern: 'foobar', type: 'EXCLUDE']]
      

      请参阅http://<YOUR_JENKINS_ADDRESS>/<path_to_pipeline_job>/pipeline-syntax/ 以生成具有正确语法的示例。

      对于 DSL 作业,有 wsCleanup() 方法(使用 excludePattern() 语法)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多