如何使用shell脚本上的scp复制到名为?的文件夹空间?

时间:2015-05-21 18:30:31

标签: shell directory scp

嘿伙计们我正在开发这个通过SSH连接到Raspberry Pi的应用程序。我使用NSTask和NSPipe以及shell脚本通过Mac应用程序GUI执行shell命令。

问题在于,当我想使用“scp”命令进行复制时,我的名称中包含空格的文件夹会出现“无此文件或目录”错误。如果路径是“/ Users / home / Desktop / New Files /”不起作用,但如果“/ Users / home / Desktop / New Files /”工作正常。

应用程序必须能够使用两个分开的命名文件夹而不能分开,但我只是不知道该怎么做。

这是我的shell脚本命令:

#!/bin/bash
/usr/bin/ssh pi@192.168.25.144 \
/usr/bin/scp /home/pi/"${1}" home@192.X.X.X:/Users/home/Documents/New Files/

ip上的“X”被故意删除,而不是真正的代码。

所以,任何人都可以帮忙????

3 个答案:

答案 0 :(得分:1)

这很棘手,因为它需要多级转义。

首先,从实际路径开始:

home@192.X.X.X:/Users/home/Documents/New Files/

现在为shell转义它:

"home@192.X.X.X:/Users/home/Documents/New Files/"

现在为scp转义它,因为scp接受shell glob模式而不是文件名:

/usr/bin/scp /home/pi/"${1}" "home@192.X.X.X:/Users/home/Documents/New\\ Files/"

现在为ssh转义它,因为ssh会在shell中对它进行评估:

/usr/bin/ssh pi@192.168.25.144 \
    /usr/bin/scp /home/pi/"${1}"  \
      '"home@192.X.X.X:/Users/home/Documents/New\\ Files/"'

这将照顾"新文件"部分,但我们也尝试对" $ {1}"做一些事情。参数:

/usr/bin/ssh pi@192.168.25.144 \
    /usr/bin/scp /home/pi/"$(printf "%q" "$1")"  \
      '"home@192.X.X.X:/Users/home/Documents/New\\ Files/"'

这是一个完整的,自包含的上述示例,通过localhost两次:

#!/bin/bash
cd ~
mkdir "New Files"
touch "my file"
set -- "my file"  # Assign $1="my file"
/usr/bin/ssh localhost \
      /usr/bin/scp "$(printf "%q" "$1")"  \
        '"localhost:New\\ Files/"'

find "New Files" -type f

输出显示它实际上确实通过ssh将带有scp空格的文件复制到带有空格的dir:

New Files/my file

由于多级转义非常棘手,如果您遇到任何问题,请务必首先尝试这个自包含的示例而不做任何修改,然后再认为它不起作用。

答案 1 :(得分:0)

在路径周围放置“”。

$ mkdir 1 1
mkdir: 1: File exists
$ mkdir "1 1"
$ ll
drwxr-xr-x  2 mikael  staff  68 May 21 22:35 1
drwxr-xr-x  2 mikael  staff  68 May 21 22:36 1 1

答案 2 :(得分:0)

尝试使用反斜杠转义空格:

home@192.X.X.X:/Users/home/Documents/New\ Files/