我正在尝试在 Groovy 语法中的以下命令中使用反斜杠:
find /path/folder-* -type f -iname "file*" -exec rm -f {} \;
当我尝试在 Jenkins 管道上构建此命令时,出现有关此语法的错误。甚至在我执行此命令之前,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
舞台清理文件夹的命令。
提前致谢
答案1
转义转义字符可能会有所帮助,尽管这听起来很有趣。只需在反斜杠前面再加一个反斜杠即可:
stage ("cleaning folders"){
sh '''
find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \\;
'''
}
至少 IntelliJ 没有将其标记为语法错误。
答案2
实际上,就您而言,我甚至懒得去弄清楚正确的转义方法:
stage ("cleaning folders"){
sh '''
find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} +
'''
}
当您将分号传递给 时-exec
,find 会构造多个命令,每个命令对应 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 ...
)。有关更多详细信息,请参阅 find 的手册页(抱歉,我现在无法引用手册页或提供更多详细信息;我在使用手机)。
答案3
一个解决方案是使用美元斜线,它会禁用字符串插值并将转义字符更改为$。
stage ("cleaning folders"){
sh script: $/
find /root/logfiles/instance* -type f -iname "file*" -exec rm -f {} \;
/$
}
答案4
完成这个特定任务的最佳方法find
是使用它的-delete
操作,这样也避免了在这种情况下使用反斜杠的需要:https://www.gnu.org/software/findutils/manual/html_mono/find.html#Using-the-_002ddelete-action