我正在尝试在 bash
中使用 scp
复制一个文件,源文件名中有一个冒号 (:
) 字符。我使用的命令的混淆版本是:
scp file\:\ name.mp4 user@host:"/path/to/dest"
我收到这个错误:
ssh: Could not resolve hostname Portal 2: Name or service not known
我知道我可以重命名文件并删除 :
,但我想知道是否可以转义冒号。
最佳答案
不完全是 bash
转义问题,它是 scp
将 x:
视为 [user@]host 前缀,尝试:
scp ./file:\ name.mp4 user@host:"/path/to/dest"
使用相对路径(例如 ./
)或完全限定路径(/path/to/source
)可以防止这种行为 - /
在 :
之前导致 OpenSSH 停止检查可能的 host:
或 user@host:
前缀)。
OpenSSH 的 scp
只处理特殊情况的文件名,以冒号开头 允许它们正常工作,它不支持转义 :
在正常意义上,并且没有其他有效主机名的概念,因此几乎任何带有 :
的文件名都可能导致这种情况(或等效的 IPv6 行为,如果 [
]
在 :
之前找到。
这也会影响其他程序,例如rsync
,同样的解决方法也适用于此。
(由于 OpenSSH 对 []
封闭的 IPv6 地址的简单解析,您可以成功地 scp
包含 :
以 开头的文件[
,或者在 :
之前包含 @[
并且不包含 ]:
,但这通常没有用;-)
(下面的文字是在 original question 是 我如何在 bash 中转义冒号? 它适用于那种情况,但不适用于 scp
因为再多的 shell 转义也无济于事。)
要回答有关如何转义 :
的问题,您不需要回答,但“\:
”可以。使用:
的地方:
- 空命令
:
,不需要转义,尽管你可以,就像\e\c\h\o foo
它对命令没有影响( “无效”并不完全正确,如果您转义一个或多个字符,它将阻止匹配别名,并且您可以别名:
) PATH
(以及其他,CDPATH
、MAILPATH
)转义这些值没有任何用处(我无法在我的 PATH 来自包含:
的目录,这有点出乎意料)- 参数扩展
${name:-x}
等,name
必须是[a-zA-Z_][a-zA-Z0-9_ ]
,所以不需要对变量名进行转义,并且由于没有歧义,不需要对后面的:
参数扩展的其他变体进行转义 ? :
三进制只对变量和数字进行运算,不需要转义==
和=~
类的模式如[[:digit:]]
,你可以使用转义\:
但我不知道它有什么用......- 在命令或函数名内,无需转义,
\:
无作用
(注意空命令只是:
,你可以有一个命令或函数命名为“:foo
”并且它可以在不转义的情况下被调用,在这个请注意,它与 #
不同,后者需要对名为 #foo
的命令进行转义。)
关于bash - 如何 scp 文件名中带有冒号的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14718720/