我正在尝试使用 rsync 将文件移动到远程位置,
该文件已命名为:DRRS_(H264).mp4
但当我尝试时:
rsync -azR output.mp4 [email protected]:encoded/somepath/DRRS_(H264).mp4
它说:bash:意外标记“(”附近出现语法错误
但我不明白我应该如何封装它。
我试过 :
rsync -azR output.mp4 [email protected]:"encoded/somepath/DRRS_(H264).mp4"
和
rsync -azR output.mp4 "[email protected]:encoded/somepath/DRRS_(H264).mp4"
没有成功。
答案1
您想使用该-s|--protect-args
选项rsync
。
如果没有它, 后面的部分将按:
原样传递到远程 shell,以便您可以使用该 shell 的构造来构建要传输的列表。
这样,如果您知道远程 shell 是 zsh,您可以执行以下操作:
rsync host:'*(.)' there
仅传输常规文件。或者用csh
/// :bash
zsh
ksh
rsync host:'{foo,bar}.txt' there
或者:
rsync file 'host:"$HOME/$(uname)-file"'
现在,这意味着您无法轻松传输任意名称的文件。
使用-s
,rsync
不会将字符串传递到远程 shell。相反,它将它带内传递到rsync
远程主机上的服务器,因此远程 shell 不会进行解释。
(
对于大多数 shell 来说很)
特殊,您必须使用远程 shell 的语法对其进行转义,并且每个 shell 的语法都不同。
最好是用它-s
代替。
rsync -sazR output.mp4 [email protected]:'encoded/somepath/DRRS_(H264).mp4'
但是,rsync
仍然对您传递的字符串执行(它自己的)通配符(即使是目的地!)。所以你仍然不能用rsync
.如果你想处理一个名为*
example 的文件,你需要用反斜杠对其进行转义(至少这一次,这与远程 shell 无关)。
rsync -sazR output.mp4 [email protected]:'\*'
因此,要传输 中包含的任意名称的文件$1
,您需要使用:
file=$1
rsync_escaped_file=$(
printf '%s.\n' "$file" | sed 's/[[*?]/\\&/g'
)
rsync_escaped_file=${rsync_escaped_file%.}
rsync -s ... "user@host:$rsync_escaped_file"
如果您的本地 shell 是bash
,并且您知道远程用户的登录 shell 也是bash
相同版本,或者,您可以使用printf %q
转义远程 shell 特有的字符而不使用-s
:
LC_ALL=C printf -v shell_escaped_file %q "$1"
rsync ... "user@host:$shell_escaped_file"
如果您知道远程主机的登录 shell 是类似 Bourne 的(Bourne、ksh、yash、zsh、bash、ash...)并且您的 ssh 客户端和服务器允许传递LC_*
环境变量,您也可以这样做(同样,不使用-s
) :
LC_FILE=$1 rsync ... 'user@host:"$LC_FILE"'
注1:-s
|--protect-args
该选项仅在 3.0.0 (2008) 或更高版本中可用
笔记2:rsync
文档警告说-s
|--protect-args
可能会成为未来版本中的默认值rsync
(因此为了面向未来,--no-protect-args
如果您不希望它的效果,您可能需要开始使用)
答案2
尝试下面的一个,我测试了这个并且它有效。您应该用'
or引用您的目标路径"
,并且应该转义(
and )
。
rsync -azR output.mp4 [email protected]:'encoded/somepath/DRRS_\(H264\).mp4'
更新:
如下调用您的脚本,
./sample.sh "encoded/somepath/DRRS_\(H264\).mp4"
样本.sh
#!/bin/bash
rsync -azR output.mp4 [email protected]:"$1"
答案3
单引号或双引号都可以。
rsync -azR output.mp4 [email protected]:"encoded/somepath/DRRS_\(H264\).mp4"
或者
rsync -azR output.mp4 [email protected]:'encoded/somepath/DRRS_\(H264\).mp4'