I'm trying to use a backslash on the command bellow at groovy syntax:
find /path/folder-* -type f -iname "file*" -exec rm -f {} \;When I try to build this command on a Jenkins pipeline give me an error about this syntax. Even before I do this command have a warning with red syntax on Jenkins form field saying unexpected char: '\'.
What could I do for replace or fix error with this backslash ?
Groovy commands:
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; ''' }
}Notice: I have rm -f for all instances at this moment. Will substitute all rm -f to the find command on the stage cleaning folders.
Tks in advance
55 Answers
It might help to escape your escape character, as funny as this might sound. Just put another backslash in front of your backslash:
stage ("cleaning folders"){ sh ''' find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \\; '''
}At least IntelliJ does not mark this as syntactically wrong.
1Actually in your case I would not even bother to figure out proper escaping:
stage ("cleaning folders"){ sh ''' find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} + '''
}When you pass a semicolon to -exec, find constructs multiple commands, one for each result of the find operation (e.g. rm -f /root/logfiles/instance/file1.log, rm -f /root/logfiles/instance/file2.log, ...), but when you use a plus, find constructs a single command with multiple arguments, which is much more efficient and fast (e.g. rm -f /root/logfiles/instance/file1.log /root/logfiles/instance/file2.log ...). See the man page for find for more detail (sorry I can't quote the man page or provide more detail right now; I'm on mobile).
One solution would be to use dollar slashy which disables string interpolation and changes escape char to $.
stage ("cleaning folders"){ sh script: $/ find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \; /$
} 1 You can use something like following $/ yor backscalsh file path /$. For example:
document root = $/home\test\new/$ The best way to do this particular task with find is to use its -delete action, which also avoids the need to even use a backslash in this case: