如何scp名称中带有空格的目录[重复]

Posted

技术标签:

【中文标题】如何scp名称中带有空格的目录[重复]【英文标题】:How to scp a directory with a space in the name [duplicate] 【发布时间】:2016-02-27 10:56:20 【问题描述】:

我现在正在尝试将整个目录从一个集群镜像复制到另一个集群。但是当名称中有空格时它会失败,我无法弄清楚如何解决这个问题,因为似乎 scp 认为我正在复制多个文件。我正在使用一个变量来标记我需要的路径,因此添加反斜杠似乎不容易解决。

这是我正在使用的代码:

if ssh user@ip -i key test -d "'$current_dir'"; then
 echo "Directory exists. Ready to copy $dir_name."
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$current_dir/$dir_name"
else
 echo Directory doesn\'t exist. Making a new directory.
 ssh user@$ip -i key mkdir "'$current_dir'"
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$current_dir/$dir_name"
fi

我尝试过单引号、双引号和带双引号的单引号,但它们都不起作用。任何人都可以帮我解决它吗?顺便说一句,代码中的 mkdir 语句有效。

【问题讨论】:

这到底是哪一部分失败了? $current_dir 的值是多少?你到底得到了什么错误? 嘿伊坦。 $current_dir 是存储从pwd 返回的路径的变量。并且错误说 scp ambiguous target。 显示失败的$current_dir 的准确错误和准确值。您可以使用 set -x 让 shell 打印出它在运行时将执行的确切命令。 设置-x后显示没有这样的文件或目录,这是合理的,因为当目录名中有空格时,scp可能会将一个目录视为两个文件。 你错过了我评论中的 show 部分。 显示 set -x 和准确的错误输出。您可能非常需要转义或额外引用文件名中的空格,以便它们通过 scp 但没有看到发生了什么我不能确定我什至知道问题是什么。 【参考方案1】:

您可以使用 sed 转义目录名称中的空格:

current_dir = "/usr/bin/Directory With Spaces"
escaped_current_dir = `sed s/ /\\ /g $current_dir`
# escaped_current_dir = "/usr/bin/Directory\ With\ Spaces"

带有转义空格的字符串将被读取为一个字符串,并且只有一个字符串,这是我们想要的。

【讨论】:

【参考方案2】:

您需要将字段分隔符设置为空格。

OIFS=$IFS  #save the original
IFS=$"\ "  #set to space
current_dir="some dir with spaces"
scp_current_dir="some\\ dir\\ with\\ spaces"
dir_name="another dir with spaces"
scp_dir_name="another\\ dir\\ with\\ spaces"
if ssh user@ip -i key test -d $current_dir; then
 echo "Directory exists. Ready to copy $dir_name."
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$scp_current_dir/$scp_dir_name"
else
 echo Directory doesn\'t exist. Making a new directory.
 ssh user@$ip -i key mkdir $current_dir
 scp -i key -r "$current_dir/$dir_name" user@$ip:"$scp_current_dir/$scp_dir_name"
fi
IFS=$OIFS  #reset it back to the original

【讨论】:

我想知道为什么投反对票?解决方案有问题吗?如果是,有更好的解决方案吗? (不是我的投票。)这有什么帮助?这会将IFS 设置在本地,但引用完全避免了基于IFS 的拆分。估计是远端有问题。 嗨科达。我不知道是谁投了反对票,但是我尝试了您的解决方案,但没有成功。仍然得到与 scp ambiguous target 相同的错误。 @Jonas 这是您正在使用的整个脚本吗?设置 IFS 应该有助于空格。如果您发布整个脚本,我可以尝试看看发生了什么。 @Jonas 我稍微修正了脚本。现在IFS=$"\ "。这可能是它对您不起作用的原因。立即尝试。【参考方案3】:

作为detailed in this answer,您需要使用两组引号,因为文件名被解释两次:一次由本地计算机解释,一次由远程计算机解释。

scp -i key -r "$current_dir/$dir_name" user@$ip:"'$current_dir/$dir_name'"

【讨论】:

是的,成功了!!!谢谢迈肯。我真的应该弄清楚如何很好地使用 stalkoverflow。谷歌没有给我这个答案。不管怎样,谢谢!感恩节快乐。 如何知道另一端将使用什么外壳,以便知道应用内引用的引用语法?这种方法是否应该只用在脚本作者可以控制另一端的 shell 的脚本中? @codeshot 非常好的问题,是的,您确实需要知道另一端正在运行什么外壳(尽管除非它像 Windows 那样令人憎恶,我认为您可以假设 sh 引用) . @codeshot 我不知道有任何 shell 将标识符用单引号括起来不会将空格与 shell 隔离,但是 - 如果存在这样的事情 - 那么是的:你会有对此进行调整。

以上是关于如何scp名称中带有空格的目录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中导入名称中带有空格的文件?

反应,渲染名称中带有空格的图像的问题

将 URL 回显到网络驱动器上名称中带有空格的文件

名称中带有空格的 SQLite 列

Git添加一个名称中带有空格的文件夹

获取名称中带有空格的频道的统计信息