Groovy синтаксис не работает с обратными слешами
Я пытаюсь использовать обратную косую черту в команде ниже в 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 ответа
Это может помочь избежать вашего побега персонажа, как бы забавно это ни звучало. Просто поместите еще один обратный слеш перед вашим обратным слешем:
stage ("cleaning folders"){
sh '''
find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \\;
'''
}
По крайней мере, IntelliJ не помечает это как синтаксически неправильное.
На самом деле в вашем случае я бы даже не удосужился выяснить, как правильно убежать:
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 ...
). См. Справочную страницу для поиска для получения более подробной информации (извините, я не могу процитировать справочную страницу или предоставить более подробную информацию прямо сейчас; я на мобильном телефоне).
Одним из решений было бы использовать долларовую косую черту, которая отключает интерполяцию строк и заменяет escape-символ на $.
stage ("cleaning folders"){
sh script: $/
find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \;
/$
}
Вы можете использовать что-то вроде следующего $/ yor backscalsh file path /$
, Например:
document root = $/home\test\new/$
Лучший способ выполнить эту конкретную задачу с
find
использовать его
-delete
действие, которое также позволяет избежать использования обратной косой черты в этом случае: https://www.gnu.org/software/findutils/manual/html_mono/find.html#Using-the-_002ddelete-action