Groovy syntax not working with backslashes
Solution 1
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.
Solution 2
Actually 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).
Solution 3
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 {} \;
/$
}
Related videos on Youtube
Marlon
Enthusiastic about Devops tools, infrastructure and multicloud.
Updated on September 18, 2022Comments
-
Marlon over 1 year
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 allrm -f
to thefind
command on the stage cleaning folders.Tks in advance
-
gamer0 almost 6 yearsthis hybrid slash wont help you? ` ∖ `
-
jayhendren almost 6 yearsCould you please post your Groovy script (or Pipeline, or whatever it is that you're using to run that command)?
-
Marlon almost 6 yearsPasted on question body the groovy script. @jayhendren
-
davidgo almost 6 yearsSince the slash character is simply escaping the following one, it may be that you just need to remove ir.
-
jayhendren almost 6 years@davidgo in this particular case the backslash is definitely necessary to ensure the semicolon is parsed by find and not the shell.
-
-
Marlon almost 6 yearsIt sound that worked fine. Tks!
-
Giovanni Tirloni over 4 yearsThere is a limit to how long a command line can be. So be careful if you have a lot of files.
-
Lesnie Sncheider over 2 yearsA small addition: "dollar slashy" strings do indeed support string interpolation see section 4.8. I'm very new to Groovy and so this is still foreign, but this seems over complicated. However, it is what I needed for Jenkins and the
sh
command in my Pipeline.