一整天都在为这个 scp 命令而烦恼。一直在搜索和询问别人等等。
$ scp -P portNumber /ReferenceFiles/CompanyA,The/Some\ DirectoryWithA\ Space/Game user@server:/ReferenceFiles/CompanyA/Game
我尝试在目录中创建一个文件,但获取的文件不存在,并且如果我尝试在目录上执行 scp 命令,我得到的结果是“不是常规文件”。
我尝试过使用双反斜杠来表示空格,使用单引号和双引号。我对这个还很陌生,当我被告知我主要会使用 PHP 和 Flash 时,我以为我会了解这些内容...
欢迎任何帮助或建议。
谢谢
答案1
解决命令行中字符转义的最简单方法之一(如果这是问题的原因)是使用制表符补全来填充“尴尬”的字符;根据 /ReferenceFiles 目录的满度,您可以执行以下操作
scp -P portNumber /Ref<tab>CompanyA<tab>Some<tab>Game/file user@server:...
或者,您可以使用 ? 代替字符,前提是不会出现太多冲突的文件/目录名称:
scp -P portNumber /ReferenceFiles/CompanyA,The/Some?DirectoryWithA?Space/Game/file ...
对于目录,您需要使用 scp 的 -r 选项(省略该选项就是为什么您会收到“不是常规文件”错误的原因)。
最后,可能是因为服务器上的目标不存在所输入的内容,而这是错误的根源(而不是源文件)?
答案2
标准 shell 转义应该足够了,因此包括逗号:
scp -P 端口号 /ReferenceFiles/CompanyA\,The/Some\ DirectoryWithA\ Space/Game 用户@服务器:/ReferenceFiles/CompanyA/Game
答案3
你必须同时使用 \ 转义和引号 :
scp -o port=portNumber "/ReferenceFiles/CompanyA,The/Some\ DirectoryWithA\ Space/Game" user@server:/ReferenceFiles/CompanyA/Game
别问我为什么,但它确实有效。
答案4
假设“Game”是一个目录,要使用 scp 复制给定目录中的所有文件,只需使用 -r(递归)选项并以目录作为目标即可。此外,目标是远程 Game 的父级名称,因此您可以从远程参数中删除“Game”。您还需要转义该逗号。
例如
$ scp -r -P portNumber /ReferenceFiles/CompanyA\,The/Some\ DirectoryWithA\ Space/Game user@server:/ReferenceFiles/CompanyA