如何 scp 文件名中带有冒号的文件?
Posted
技术标签:
【中文标题】如何 scp 文件名中带有冒号的文件?【英文标题】:How can I scp a file with a colon in the file name? 【发布时间】:2013-01-21 00:58:00 【问题描述】:我正在尝试使用bash
中的scp
在源文件名中使用冒号(:
) 字符复制文件。我正在使用的命令的混淆版本是:
scp file\:\ name.mp4 user@host:"/path/to/dest"
我收到此错误:
ssh: Could not resolve hostname Portal 2: Name or service not known
我知道我可以重命名文件并删除:
,但我想知道是否可以转义冒号。
【问题讨论】:
【参考方案1】:不完全是bash
转义问题,是scp
将x:
视为[user@] 主机前缀,试试:
scp ./file:\ name.mp4 user@host:"/path/to/dest"
使用相对路径(例如./
)或完全限定路径(/path/to/source
)可以防止这种行为 - 在:
之前存在/
会导致OpenSSH 停止检查可能的host:
或user@host:
字首)。
OpenSSH 的 scp
仅在特殊情况下以冒号开头 的文件名允许它们正常工作,它不支持在正常意义上转义 :
,并且没有其他有效主机名的概念,因此几乎任何带有 :
的文件名都可能导致此问题(或者如果在 :
之前找到 [
]
则等效的 IPv6 行为)。
这也会影响其他程序,例如rsync
,同样的解决方法在那里适用。
(由于OpenSSH对[]
封闭的IPv6地址的简单解析,您可以成功地scp
文件包含:
以[
开头,或者在:
之前包含@[
而不包含@ 987654345@ ,但这通常没有用;-)
(下面的文字是在 original question 是 如何在 bash 中转义冒号? 它适用于那种情况,但不适用于 scp
因为再多的外壳逃逸都无济于事。)
要回答关于如何 逃离:
的问题,您不需要这样做,但“\:
”可以。使用:
的地方:
-
空命令
:
,不需要转义,虽然你可以,就像\e\c\h\o foo
它对命令没有影响(“没有影响”并不完全正确,如果你转义一个或多个字符它会防止别名被匹配,你可以别名:
)
PATH
(和其他人,CDPATH
,MAILPATH
)转义值没有有用的效果(我无法从包含:
的目录中运行我的PATH中的程序,这有点意外)
参数扩展$name:-x
和更多,name
必须是[a-zA-Z_][a-zA-Z0-9_]
,所以不需要转义变量名,并且由于没有歧义,不需要在参数扩展的其他变体中转义后续的:
? :
trinary 只对变量和数字进行操作,不需要转义
==
和 =~
与 [[:digit:]]
这样的模式中的类,你可以用 \:
逃脱,但我不知道这有什么用处......
在命令或函数名内,无需转义,\:
没有用处
(请注意,空命令只是:
,你可以有一个名为“:foo
”的命令或函数,并且可以在不转义的情况下调用它,在这方面它与#
不同,其中一个命令名为#foo
需要转义。)
【讨论】:
同样的问题影响rsync
。幸运的是,同样的解决方案——在文件名前加上./
——也有帮助。
三进制 :) 还是三进制?【参考方案2】:
我尝试使用完全合格的路径作为@mr.spuratic 的答案,但不起作用,在我的情况下,我必须使用绝对路径,这是我的解决方案:
scp `hostname`:/root/this/is/test/file.txt user@host:"/path/to/dest"
【讨论】:
以上是关于如何 scp 文件名中带有冒号的文件?的主要内容,如果未能解决你的问题,请参考以下文章
通过 pyspark 加载文件名中包含冒号的 Amazon S3 文件