scp 分号未能转义第二个分号

scp 分号未能转义第二个分号

我似乎无法使这个命令工作:

scp fx-devel1:/home/user/gege/feed.zip;2 fx-devel2:/home/user/gege/feed.zip;3

我努力了:

scp "fx-devel1:/home/user/gege/feed.zip;\2" "fx-devel2:/home/user/gege/feed.zip\;3"

但它似乎只逃脱了第一个“;”如下所示:

feed.zip;2                                                    100%  302KB 301.8KB/s   00:00
bash: 3: command not found

我该如何让它发挥作用?我想在目标文件的名称中包含“;3”。

编辑:当我即兴创作时,我可以让它工作——我必须在传输后使用 mv:

scp 'fx-devel1:/home/user/gege/feed.zip\;2' fx-devel2:/home/user/gege/feed.zip

ssh fx-devel2 mv /home/user/gege/feed.zip '/home/user/gege/feed.zip\;3'

但这意味着更多的时间。当传输数千个文件时,访问服务器的时间几乎会增加一倍。

答案1

这对我有用:

/tmp $ ls foo*
'foo;2'
/tmp $ scp 'foo;2' 'localhost:/tmp/foo\;3'
Password:
foo;2                                            100%    0    0.0KB/s    0.0KB/s    00:00
/tmp $ ls foo*
'foo;2'  'foo;3'
/tmp $

答案2

在 bash 中,单引号 ( ') 和双引号 ( ") 都可以用来引用分号。不需要在引用的字符串中添加额外的反斜杠来引用它们。您需要反斜杠来引用双引号内的一些特殊字符,但分号不是其中之一("例如\是)。

经过测试我断定该Command not found消息来自远程机器!所以以上说法属实,至少只要涉及到一个外壳就不会! 但这里目标文件名似乎以某种方式传递到另一侧的外壳。

因此,如果您的文件被调用/home/user/gege/feed.zip;2并且应该保存/home/user/gege/feed.zip;3在另一台机器上,那么这些都应该可以工作

scp 'fx-devel1:/home/user/gege/feed.zip;2' 'fx-devel2:/home/user/gege/feed.zip\;3'
scp "fx-devel1:/home/user/gege/feed.zip;2" "fx-devel2:/home/user/gege/feed.zip\\;3"
scp fx-devel1:/home/user/gege/feed.zip\;2 fx-devel2:/home/user/gege/feed.zip\\\;3

您可以使用以下函数进行一些测试,看看 shell 中的引用如何为您自己工作(显然,请阅读手册页的相关部分):

test_quoting () {
  printf 'Number of args: %s\n' "$#"
  printf 'First arg: %s\n' "$1"
}
test_quoting abc def
test_quoting "abc def"
test_quoting 'xyz;123'
test_quoting foo\;bar
test_quoting 'foo\;bar'
# and so on

相关内容