为什么在find命令的-exec选项中需要反斜杠和分号?

79

我已经开始在Linux终端中组合不同的命令。我想知道为什么像这样的命令需要反斜杠和分号:

find ./ -name 'blabla' -exec cp {} ./test \;

当一个简单的cp命令就足够:

cp randomfile ./test

没有 \;

它们是用来清晰地表示命令的结束,还是文档中要求必须添加?其背后的原则是什么?

without the \;


14
单独使用分号 ; 会结束命令。使用 \;,相当于将字面上的分号 ; 作为参数传递给 find 命令。 - Linuxios
2个回答

76

在分隔 shell 命令时,分号是列表操作符之一(或者 &&, ||),因此在分号前使用反斜杠。例如:

command1; command2

find 工具在使用 -exec 选项时,会使用 ;+ 符号来结束被调用的 shell 命令。

因此,为了避免特殊的 shell 字符被解释,需要使用反斜杠进行转义,以去除下一个字符读取时的特殊含义和行继续符。

因此,以下示例语法是允许使用的 find 命令:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

另请参见:


11
谢谢你列出这些替代选项。 - marcovtwout

60

来自"man find":

find命令后面的所有参数都被视为该命令的参数,直到遇到一个由";"组成的参数为止。

find需要知道exec的参数何时终止。在shell中使用";"作为终止符是很自然的,因为shell也使用这个字符。出于同样的原因,如果要在shell中插入这样的字符,则必须对其进行转义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接