![让 rsync 处理带有单引号的单个文件](https://linux22.com/image/497633/%E8%AE%A9%20rsync%20%E5%A4%84%E7%90%86%E5%B8%A6%E6%9C%89%E5%8D%95%E5%BC%95%E5%8F%B7%E7%9A%84%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我正在同步一个包含大量文档的目录。用户输入的文档的文件名中包含各种奇怪的字符。我需要将这些文件从 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"
请注意,即使是远程的server
和user
也在引号下。
答案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 发出的信号,它可能不能作为参数的一部分。