tar --exclude 値で配列

tar --exclude 値で配列

一部のバックアップスクリプトを作成したいが、一部のディレクトリを除外する必要があります。そのため、私は除外されたすべてのディレクトリをこのような配列に設定することにしました。

exclude[0] = '/home/user/test1'
exclude[1] = '/home/user/test2'
exclude[2] = '/home/user/test3'

この配列をtarコマンドの引数として提供できますか?

tar -zcvf $FILE $SOURCE --exclude=exclude

答え1

そしてzsh

exclude=(
  /home/user/test1
  /home/user/test2
  /home/user/test3
)
tar  --exclude=$^exclude -zcvf $FILE $SOURCE

この$^exclude構文を使用すると、上記の内容を次に拡張できます。

tar  --exclude=/home/user/test1 --exclude=/home/user/test2 \
     --exclude=/home/user/test3 -zcvf the-file the-source

rcデフォルトでは、およびesシェルはfish配列を使用してこれを実行するため、これらのシェルでは次のことができます。

tar  --exclude=$exclude -zcvf $FILE $SOURCE

set exclude /home/user/test1 /home/user/test2 /home/user/test3(配列を定義するために使用されますfish

答え2

コマンドの各パラメーターは文字列です。このオプションには配列を渡すことはできません--exclude。複数のオプションを渡す--excludeか、次のような他の方法を使用する必要があります。--exclude-from一部のシェルには配列に挿入し、各要素の前に次を付ける賢い方法があります。しかし、ほとんどの場合(sh、bash、ksh、...)はこれを行いません。

すべてのシェルで動作する1つの方法は、コマンドラインを段階的に作成することです。

set -- tar -zcvf "$FILE" 
set -- "$@" --exclude='/home/user/test1'
set -- "$@" --exclude='/home/user/test2'
set -- "$@" --exclude='/home/user/test3'
"$@" "$SOURCE"

bashまたはkshを使用していて除外するパターンセットがある場合は、配列を繰り返してコマンドラインを作成できます。

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
exclude_options=()
for x in "${exclude[@]}"; do
  exclude_options+=(--exclude="$x")
done
tar -zcvf "$FILE" "${exclude_options[@]}" "$SOURCE"

以前のバージョンのkshとbashには演算子が不足しており、ループ本体として+=必要でした。exclude_options=("${exclude_options[@]}" --exclude="$x")

除外オプション用に別々の配列を作成する代わりに、名前付き配列変数または位置引数配列から直接コマンドラインを作成できます。

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
set -- tar -zcvf "$FILE"
for x in "${exclude[@]}"; do
  set -- "$@" --exclude="$x"
done
 "$@" "$SOURCE"

答え3

あるいは、--exclude-fromスイッチを使用して複数の場所を処理できます。

tar --exclude-from=/home/user/exclude.txt -zcvf "$FILE" "$SOURCE"

次に、1行に1つの正規表現を含むファイルを作成します。

cat /home/user/exclude.txt

/home/user/test1
/home/user/test2
/home/user/test3

答え4

sudo rsync -avz -e "ssh -i your-pem-key.pem" --exclude-from=folder-name-files/exclude.txt folder-name-files/ [email protected]:folder-files/

ファイルでは、exclude.txt次のように無視されたすべてのファイルに言及する必要があります。

/assets
.gitignore
exclude.txt

関連情報