Wil*_*man 7 scp windows escape-characters
我正在尝试将文件从本地 Linux 计算机传输到远程 Windows 计算机,并且在 scp 处理带空格的 Windows 文件路径的方式上发现了一些不一致的情况...
这是可行的,请注意,本地文件的路径中的空格已正确转义:
scp /home/will/file\ with\ spaces.txt remote@host:D:/Users/will/Downloads/
Run Code Online (Sandbox Code Playgroud)
然而,尽管“Google Drive”文件夹中的空间被正确转义,但这不起作用:
scp /home/will/file\ with\ spaces.txt remote@host:D:/Users/will/Google\\ Drive/Documents/Computer_Stuff/Home_Lab/folder
Run Code Online (Sandbox Code Playgroud)
我在网上浏览了大量资源,人们遇到了类似的问题,但他们的所有解决方案都不适合我。
我尝试将 Windows 文件路径放在双引号、单引号中,带或不带转义空格;我尝试过使用双倍\\
和三倍\\\
来逃避空格;我什至尝试转义冒号 ( D\:
); 我尝试明确指定目标文件名,但没有。什么都没起作用。
然后我找到了这个答案,只有方法#2有效!为什么?'"
、 和中包围 Windows 文件路径有什么区别"'
?为什么我可以在本地 Linux 文件路径中完全不使用任何引号而简单地转义空格,但在远程 Windows 路径中却不能?
你的 shell 正在看到Google\\ Drive
,并将其解析为Google
,后跟一个字面上的反斜杠,一个空格(它将参数分隔开scp
,后跟Drive
,然后将其传递给 SCP,现在你正在发送它,它不知道该怎么做争论太多。
为了更清楚地说明这一点,请比较 shell 如何解析Google\ Drive
和Google\\ Drive
:
$ cat 443236.sh
#!/bin/bash
foo=(Google\ Drive)
echo "Unrolling \$foo[@]:"
for f in "${foo[@]}"; do
echo "'$f'"
done
foo=(Google\\ Drive)
echo "Unrolling \$foo[@]:"
for f in "${foo[@]}"; do
echo "'$f'"
done
$ ./443236.sh
Unrolling $foo[@]:
'Google Drive'
Unrolling $foo[@]:
'Google\'
'Drive'
Run Code Online (Sandbox Code Playgroud)