0

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

  • this hybrid slash wont help you? ` ∖ ` – user902300 May 26 '18 at 13:43
  • 1
    Could you please post your Groovy script (or Pipeline, or whatever it is that you're using to run that command)? – jayhendren May 29 '18 at 15:57
  • Pasted on question body the groovy script. @jayhendren – Marlon May 30 '18 at 9:27
  • Since the slash character is simply escaping the following one, it may be that you just need to remove ir. – davidgo May 30 '18 at 9:35
  • 1
    @davidgo in this particular case the backslash is definitely necessary to ensure the semicolon is parsed by find and not the shell. – jayhendren May 30 '18 at 17:19
4

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.

  • It sound that worked fine. Tks! – Marlon Jun 7 '18 at 3:57
0

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).

0

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 {} \;
    /$
}

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.