Bash

無法使用變數來指定腳本中 rsync 的“–exclude={..}”選項的目標

  • July 13, 2021

我的目標是讓我的 bash 腳本執行這個命令:

rsync -azhi --dry-run --exclude={'file1.txt','file2.txt','*.sql'} /from-directory/ /to-directory/

…當如此抽象時:

srcdir='/from-directory/'
dstdir='/to-directory/'
excludes="{'file1.txt','file2.txt','*.sql'}"
rsync -azhi --dry-run --exclude="$excludes" "$srcdir" "$dstdir"

$srcdir$dstdir正確評估,但$excludes沒有像我希望的那樣被解釋。從命令行, –exclude={‘file1.txt’,‘file2.txt’,’*.sql’} 效果很好。但是,一旦我嘗試將該 {…} 字元串填充到變數中,它就會停止工作。

嘗試使用數組。例如:

excludes=(file1.txt file2.txt '*.sql')
rsync -azhi --dry-run $(printf -- "--exclude=%s " "${excludes[@]}") /from-directory/ /to-directory/

順便說一句,如果您希望它擴展到目前目錄中的所有 .sql 文件,請不要*.sql用單引號括起來。我猜這不是你想要的,所以我引用了它。

這將擴展為:

rsync -azhi --dry-run --exclude=file1.txt --exclude=file2.txt --exclude=*.sql /from-directory/ /to-directory/

或者:

rsync -azhi --dry-run --exclude="$(printf -- "%s," "${excludes[@]}" |
   sed -e s/,$//)" /from-directory/ /to-directory/

將擴展為:

rsync -azhi --dry-run --exclude=file1.txt,file2.txt,*.sql /from-directory/ /to-directory/

引用自:https://unix.stackexchange.com/questions/658213