変数を使用してrsyncを介した複数のディレクトリの除外

変数を使用してrsyncを介した複数のディレクトリの除外

次のコードスニペットは、私が作業しているより大きなBashスクリプトの一部です。私の目的は、入力変数をRsyncにパラメータとして渡すことです。

"--exclude"引数を除いて、ほとんどが動作するようにしました。

INCLUDE="/.vim*,/.git*,/.ssh,.bash_aliases,.bashrc"  

rsync ${DRYRUNARG} -avzhP --delete ${SOURCE_DIRS} \                                                 
    --include=${INCLUDE} \                                                                          
    --exclude={/VirtualBox_VMs/*/Snapshots,/snap,/Downloads,/.*} \                                  
    ${MNTPNT}${DEST_DIR}

このコードは私の要件に非常に適していますが、変数として定義する必要がある除外ディレクトリを見続けたいと思います。

必要な結果コードは次のようになります。

INCLUDE="/.vim*,/.git*,/.ssh,.bash_aliases,.bashrc"
EXCLUDE="/VirtualBox_VMs/*/Snapshots,/snap,/Downloads,/.*"       

rsync ${DRYRUNARG} -avzhP --delete ${SOURCE_DIRS} \                                                 
    --include=${INCLUDE} \                                                                          
    --exclude=${EXCLUDE} \                                  
    ${MNTPNT}${DEST_DIR}

上記のコードは機能しません。コマンドはエラーなしで実行されますが、何も除外できません。興味深いことに、1つのディレクトリでEXCLUDE変数を定義すると、INCLUDE変数で使用されているのと同じ構造に従います。

私はいくつかの愚かな間違いを犯したと確信しています。どこにありますか?

ベストアンサー1

個別の項目リストを単一の文字列に縮小しないでください。これにより、さまざまな項目を解析するのが難しく、区切り文字などで使用される文字を含む可能性がある項目を処理する必要があります。また、rsyncコンマ区切りの包含/除外パターンのリストを解析する方法がわかりません。

代わりに配列を使用してください。

#!/bin/bash

INCLUDE=( '/.vim*' '/.git*' /.ssh .bash_aliases .bashrc )
EXCLUDE=( '/VirtualBox_VMs/*/Snapshots'  /snap /Downloads '/.*' )

次に、次のリストの各項目の前に合計を挿入して--exclude新しいリストを作成します。--include

exclude_opts=()
for item in "${EXCLUDE[@]}"; do
    exclude_opts+=( --exclude="$item" )
done

include_opts=()
for item in "${INCLUDE[@]}"; do
    include_opts+=( --include="$item" )
done

次に、呼び出しで次の新しいリストを使用しますrsync(これがSOURCE_DIRSソースディレクトリの配列であると仮定します)。

rsync ${DRYRUNARG:+"$DRYRUNARG"} -avzhP --delete \
    "${include_opts[@]}" \
    "${exclude_opts[@]}" \
    "${SOURCE_DIRS[@]}" \
    "$MNTPNT/$DEST_DIR"

ここで$DRYRUNARG設定され、空でない場合は引用符で囲み、そうでなければコマンドラインの一部はまったくありません。

おすすめ記事