更新:

更新:

我正在尝试使用 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/// :bashzshksh

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) 或更高版本中可用

笔记2rsync文档警告说-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'

相关内容