我似乎无法使这个命令工作:
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