在bash脚本中执行scp从远程复制多个目录



我想写一个bash脚本,使用scp命令将多个目录从树莓派传输到我的笔记本电脑。但是我的代码只在一台笔记本电脑(MacBook Pro 2016)上工作,但在另一台笔记本电脑(MacBook Pro 2020)上失败了,这很奇怪。

我想执行的命令是:

scp -rp pi@192.168.0.163:/home/pi/Documents/data/{directory1,directory2,directory3} .

当我在两台笔记本电脑的终端上直接执行这个命令时,它工作得很好。但是当我将它放入bash脚本中时:

#!/bin/bash
scp -rp "pi@192.168.0.163:/home/pi/Documents/data/{directory1,directory2,directory3}" "."

在我的MacBook Pro 2020上显示错误scp: /home/pi/Documents/data/{directory1,directory2,directory3}: No such file or directory,但在我的MacBook Pro 2016上运行良好。

我已经在两台笔记本电脑上检查了bash版本,但似乎它们没有太大的差异

MacBook Pro 2016: GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin21)
MacBook Pro 2020: GNU bash, version 3.2.57(1)-release (x86_64-apple-达尔文22)

有人能帮我吗?

-------------------------------- 以下是更新 --------------------------------

好像我没有很好地解释我的问题。

我的实际情况要复杂一些。我正在编写一个bash脚本,该脚本采用多个目录作为参数,从我的树莓派远程执行scp。我的script.sh如下:

#!/bin/bash
while getopts "hu:" option; do
case $option in
h) # display Help
Help
exit;;
u)
user_list+=("$OPTARG");;
?) # incorrect option
echo "Error: Invalid option"
exit;;
esac
done
RASPBERRYPI_DATA_PATH="/home/pi/Documents/data"
RASPBERRYPI_ADDR=$1
RASPBERRYPI_USER_NAME="pi"
scp -rp ${RASPBERRYPI_USER_NAME}@${RASPBERRYPI_ADDR}:${RASPBERRYPI_DATA_PATH}/{${user_list[@]// /,}} .

我以这种方式执行脚本:

./script.sh -u "directory1 directory2" 192.168.0.163

在我的MacBook Pro 2020上显示错误:scp: /home/pi/Documents/data/{directory1,directory2}: No such file or directory,但在我的MacBook Pro 2016上运行良好。

我是bash开发的新手。我想我在语法上犯了错误。但是这个脚本在我的旧MacBook Pro上运行得很好,这很奇怪。

非常感谢你的帮助。

这是由于脚本中的双引号造成的。删除它们,它应该又可以工作了。

测试如下:

cd /tmp
mkdir -p data/{directory1,directory2,directory3}
mkdir -p "data/{directory1,directory2,directory3}"
ls -alrt /tmp/data

输出:

drwxr-xr-x   2 tscanlan  wheel   64 Nov 12 08:54 directory1
drwxr-xr-x   2 tscanlan  wheel   64 Nov 12 08:54 directory2
drwxr-xr-x   2 tscanlan  wheel   64 Nov 12 08:54 directory3
drwxr-xr-x   2 tscanlan  wheel   64 Nov 12 08:54 {directory1,directory2,directory3}

为什么?bash和zsh中的大括号展开就是这样工作的。

  • https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html
  • https://zsh.sourceforge.io/Doc/Release/Expansion.html Brace-Expansion

正确形成的大括号展开必须包含未加引号的开、闭大括号,以及至少一个未加引号的逗号或一个有效的序列表达式。任何不正确形成的大括号展开都保持不变。

我会使用rsync。Rsync特别有用,因为它可以进行增量备份,为您节省大量时间和带宽。您可以根据用户输入构造输入目录列表,并像在

下调用rsync。
rsync -a /path/to/dir1 /path/to/dir2 user@remoteserver:/path/to/target

将在目标

上创建以下目录
/path/to/target/dir1
/path/to/target/dir2

最新更新