让 rsync 处理带有单引号的单个文件

让 rsync 处理带有单引号的单个文件

我正在同步一个包含大量文档的目录。用户输入的文档的文件名中包含各种奇怪的字符。我需要将这些文件从 Linux 上的一个位置同步到另一个位置。很多时候只需要更新一个文件。当文件名包含单引号时,它会崩溃。我需要为目标指定 user@server,否则它会起作用。例如:

rsync --rsh=ssh "zz/joe's change.txt" "/somedir/y/joe's change.txt"

作品。

rsync --rsh=ssh "zz/joe's change.txt" user@server:"/somedir/y/"

也有效。

但我希望使用的形式是:

rsync --rsh=ssh "zz/joe's change.txt" user@server:"/somedir/y/joe's change.txt"

失败:

bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
rsync: connection unexpectedly closed (0 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(165)

我可以使用第二种形式(除非某些疯子在目录名中放入一个'),但我真正想使用的还是第三种形式。

答案1

在这种情况下,最终对我有用的是使用--protect-args-s参数,然后将整个内容放在引号下,如下所示:

rsync -s --rsh=ssh "zz/joe's change.txt" "user@server:/somedir/y/joe's change.txt"

请注意,即使是远程的serveruser也在引号下。

答案2

您可能需要转义该字符。来自 bash 手册页

未加引号的反斜杠 (\) 是转义字符。它保留其后的下一个字符的字面值,但 <newline> 除外。

答案3

Gleb 让我走上了正确的道路。我曾尝试过在引号内进行转义(以及对目标进行引号和转义的其他变体),但没有成功。

我现在回过头来发现通过双重转义目的地它可以起作用:

rsync --rsh=ssh "zz/joe's change.txt" user@server:/somedir/y/joe\\\'s\\\ change.txt

或者

rsync --rsh=ssh zz/joe\'s\ change.txt user@server:/somedir/y/joe\\\'s\\\ change.txt

答案4

尝试:

rsync --rsh=ssh "zz/joe's change.txt" "user@server:/somedir/y/joe's change.txt"

“” 是向 shell 发出的信号,它可能不能作为参数的一部分。

相关内容