Удалить все папки, кроме одной (или более) - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующий шаг, который должен удалить все папки, кроме foobar:

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

Генерирует следующую команду:

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

Это ничего не делает. Но если я наберу команду в моем терминале (за пределами Jenkins) без простых кавычек, окружающих путь, это сработает.

Почему Дженкинс генерирует простые цитаты? Как их убрать, чтобы команда работала?

(я запускаю Jenkins на OSX)

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Для удаления рабочей области (кроме папки 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()).

0 голосов
/ 21 января 2019

Тип glob !(name) не работает, если вы не установите shopt -s extglob в баш.

Пожалуйста, попробуйте:

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

Пожалуйста, не забудьте заранее сделать резервную копию папок, чтобы избежать случайной потери файлов.

...