如何在scp命令中处理含空格的文件名?解决远程文件下载报错
解决SCP传输带空格文件名的报错问题
这个问题我太熟悉了——本质是shell的空格解析逻辑在搞鬼!当你直接用双引号包裹远程路径时,本地shell会先把外层的双引号去掉,然后把路径里的空格当成参数分隔符,把原本一个完整的文件名拆成了好多个零散的“文件”传给scp,自然就会出现一堆"No such file or directory"的错误。
给你几个靠谱的解决办法,按推荐度排序:
方法1:用单引号包裹远程路径(最推荐)
单引号在shell里会完全保留内部的所有字符(包括空格、特殊符号),不会进行解析。注意要把本地变量$ip放在单引号外面,让本地shell先解析它,再把完整的远程路径传给scp:
scp root@$ip:'/tmp/Protests continue in Portland, Oregon _ LIVE-daAaLP8m6WU.mp4' /tmp
这里的单引号是传给远程shell的,远程shell会把单引号内的内容识别为一个完整的文件名,完美避开空格拆分的问题。
方法2:对远程路径的空格逐个转义
在每个空格前加上反斜杠\,告诉shell这个空格是文件名的一部分,不是参数分隔符:
scp root@$ip:/tmp/Protests\ continue\ in\ Portland,\ Oregon\ _\ LIVE-daAaLP8m6WU.mp4 /tmp
这种方法也有效,但如果文件名里空格很多,手动加反斜杠容易漏,不如单引号方便。
方法3:嵌套双引号(不推荐,容易搞混)
如果你非要用双引号,可以把远程路径里的空格转义,或者用双引号嵌套(需要转义内部的双引号),比如:
scp "root@$ip:/tmp/Protests\ continue\ in\ Portland,\ Oregon\ _\ LIVE-daAaLP8m6WU.mp4" /tmp
不过这种写法可读性差,不如前两种直观,不推荐日常使用。
内容的提问来源于stack exchange,提问作者user7988893




