嘿伙计们我正在开发这个通过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”被故意删除,而不是真正的代码。
所以,任何人都可以帮忙????
答案 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/