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

How to copy using scp on shell script to folders space named?

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

问题是,当我想使用 "scp" 命令进行复制时,出现 "No such file or directory" 错误,文件夹名称中包含空格。如果路径是“/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/"" home@192.X.X.X:/Users/home/Documents/New Files/

ip 上的 "X" 是故意删除的,它不是真正的代码。

所以,有人可以帮忙吗????

在路径两边加上“”。

$ 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

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

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

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

首先从实际路径入手:

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/"" "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/""  \
      '"home@192.X.X.X:/Users/home/Documents/New\ Files/"'

这处理了 "New Files" 部分,但我们也尝试对“${1}”参数做一些事情:

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

这是一个完整的、独立的上述示例,通过本地主机两次:

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

find "New Files" -type f

输出显示它确实通过 ssh 通过 scp 复制了一个带空格的文件到带空格的目录:

New Files/my file

由于多级转义很棘手,如果您有任何问题,请务必先尝试这个独立的示例而不进行修改,然后再断定它不起作用。