Groovy syntax not working with backslashes

23,230

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 {} \;
    /$
}
Share:
23,230

Related videos on Youtube

Marlon
Author by

Marlon

Enthusiastic about Devops tools, infrastructure and multicloud.

Updated on September 18, 2022

Comments

  • Marlon
    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 all rm -f to the find command on the stage cleaning folders.

    Tks in advance

    • gamer0
      gamer0 almost 6 years
      this hybrid slash wont help you? ` ∖ `
    • jayhendren
      jayhendren almost 6 years
      Could you please post your Groovy script (or Pipeline, or whatever it is that you're using to run that command)?
    • Marlon
      Marlon almost 6 years
      Pasted on question body the groovy script. @jayhendren
    • davidgo
      davidgo almost 6 years
      Since the slash character is simply escaping the following one, it may be that you just need to remove ir.
    • jayhendren
      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
    Marlon almost 6 years
    It sound that worked fine. Tks!
  • Giovanni Tirloni
    Giovanni Tirloni over 4 years
    There is a limit to how long a command line can be. So be careful if you have a lot of files.
  • Lesnie Sncheider
    Lesnie Sncheider over 2 years
    A 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.