
同様のフラグを使用して複数のコマンドを実行したいとします。たとえば、次のようになります。
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
--exclude
一連のフラグを再利用し、これらのフラグを変数に保存するのと同じように、コードをよりきれいにしたいと思います。
その後、上記のコマンドは次のようになります
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
そのtar
ディレクトリに関連付けられているファイルとディレクトリは除外されます。
最良かつクリーンなソリューションは何ですか?
背景
tarを使用してシステムをバックアップし、必要のないいくつかのディレクトリを除外したいと思います。
答え1
次のことを試すことができます。
$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
bash
ここでは履歴拡張を使用します。
!!
最後のコマンドを参照してください3-$
3番目のパラメータから最後のパラメータまでを参照してください。
bash
非対話型シェルでは、無効な履歴拡張機能をスクリプトで有効にする必要があります。
set -o history
set -o histexpand
答え2
Bashで非常にきれいな方法は配列を使用することです。
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
スペースやその他の興味深い文字を処理できます。
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
/this/one
たとえば、ディレクトリに文字を含むすべてのサブディレクトリを除外したい場合は、偽造することもできますg
。
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
答え3
これをコメントとして追加したかったのですが、まだコメント形式を素敵に指定する方法が見つかりませんでした。
とにかく私はあなたが90%成功したと思います。努力する:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
最初の行にはスペースが含まれているため、引用符が必要です。
スペースで引数を分割するには、引用符なしで変数を使用します。
除外されたディレクトリ名にスペースが含まれている場合はエスケープする必要があります。