我正在尝试传递一个变量以从脚本中的 rsync 操作中排除几个文件夹,如下所示:
echo "Type the path of the folders to exclude: "
while read folder
do
folders=("${folders[@]}""$folder",)
while
rsync -avh source/* destination --exclude={"${folders[@]}"}
我的源文件夹具有以下结构:
- file1.txt
- file2.txt
- dir1
- dir2
- file3.txt
- dir2
- flie4.txt
- dir3
当我运行脚本并输入 dir2、按、输入 dir3、再次按并按 + D 退出 while 循环时,rsync 不会排除给定的文件夹,显示以下结果:
$ ./script
Type the path to the folders to exclude:
dir2
dir3
sending incremental file list
created directory destination
file1.txt
file2.txt
dir1/
dir1/dir2/
dir1/dir2/file3.txt
dir2/
dir2/file4.txt
dir3/
如果您运行脚本并folders
像echo "${folders[@]}"
调用 rsync 之前一样回显变量,我们会得到给定的值dir2,dir3,
,但我不知道为什么 rsync 没有扩展变量。我也尝试过只传递$folders
给 --exclude 选项,但尽管它仍然显示正确的值,但它不会在引用的选项内扩展。
仅当我手动传递一个值或手动传递第一个值并仅传递变量内的一个文件夹时,脚本才会起作用,如下所示:
folders="dir3"
rsync -avh source/ destination --exclude={dir2,"$folders"}
这让我相信,每次我在 bash 变量内放置逗号时,rsync 都无法将其识别为逗号,或者 bash 根本不会扩展变量。
有人知道发生了什么吗?我一点头绪都没有。
我正在使用 ubuntu 20.04 Focal Fossa(开发分支)。
答案1
注意:未经适当测试;我将其添加-n
到 rsync 命令中以进行测试
尝试以下方法:
#!/bin/bash
declare -a excludes
echo "Type the path of the folders to exclude: "
while IFS= read -r folder
do
excludes+=( --exclude="$folder" )
done
rsync -n -avh "${excludes[@]}" -- source/ destination/