Я пытаюсь использовать обратную косую черту для команды ниже в Groovy синтаксис:

find /path/folder-* -type f -iname "file*" -exec rm -f {} \;

Когда я пытаюсь построить эту команду на конвейере Jenkins, выдается ошибка об этом синтаксисе. Еще до того, как я выполнил эту команду, в поле формы Дженкинса появилось предупреждение с красным синтаксисом, говорящее о неожиданном символе: '\'.

Что я могу сделать для замены или исправления ошибки с этой обратной косой чертой?

Groovy команды:

node ("instance") {
    stage ("cleaning folders"){
        sh '''        
        find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \;
        '''
    }
    stage ("instance1"){
        sh '''
        rm -f /root/logfiles/instance1/*
        echo instance1; 
        scp 100.0.0.50:/var/log/file1.log /root/logfiles/instance1/file1.log;
        scp 100.0.0.50:/var/log/file2.log /root/logfiles/instance1/file2.log;
        '''
    }
    stage ("instance1"){
        sh '''
        rm -f /root/logfiles/instance2/*
        echo instance2; 
        scp 100.0.0.51:/var/log/file1.log /root/logfiles/instance2/file1.log;
        scp 100.0.0.51:/var/log/file2.log /root/logfiles/instance2/file2.log;
        '''
    }
}

Обратите внимание: у меня есть rm -f для всех случаев в данный момент. Подставим все rm -f команде find на этапе очистки папок.

ТКС заранее

3 ответа3

4

Это может помочь избежать побега вашего персонажа, как бы забавно это ни звучало. Просто поместите еще одну обратную косую черту перед вашей обратной косой чертой:

stage ("cleaning folders"){
    sh '''        
    find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \\;
    '''
}

По крайней мере, IntelliJ не помечает это как синтаксически неправильное.

0

На самом деле в вашем случае я бы даже не удосужился выяснить, как правильно убежать:

stage ("cleaning folders"){
    sh '''        
    find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} +
    '''
}

Когда вы передаете точку с запятой в -exec , команда find создает несколько команд, по одной для каждого результата операции поиска (например, rm -f /root/logfiles/instance/file1.log , rm -f /root/logfiles/instance/file2.log , ...), но когда вы используете плюс, find создает одну команду с несколькими аргументами, что намного эффективнее и быстрее (например, rm -f /root/logfiles/instance/file1.log /root/logfiles/instance/file2.log ...). См. Справочную страницу для поиска более подробной информации (извините, я не могу процитировать справочную страницу или предоставить более подробную информацию прямо сейчас; я на мобильном телефоне).

0

Одним из решений было бы использовать долларовую косую черту, которая отключает интерполяцию строк и заменяет escape-символ на $.

stage ("cleaning folders"){
    sh script: $/
    find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \;
    /$
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .