删除除一个(或多个)以外的所有文件夹

时间:2019-01-21 00:13:47

标签: bash jenkins sh jenkins-pipeline

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

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

它将生成以下命令:

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

它什么都不做。但是,如果我在终端(Jenkins外部)中键入命令,但路径周围没有简单的引号,则该命令有效。

为什么詹金斯生成简单的报价?如何删除它们以便命令起作用?

(我在OSX上运行Jenkins)

2 个答案:

答案 0 :(得分:0)

除非您设置!(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

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

答案 1 :(得分:0)

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

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

有关使用正确语法生成示例的信息,请参见http://<YOUR_JENKINS_ADDRESS>/<path_to_pipeline_job>/pipeline-syntax/

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