複数のコマンドに類似したフラグを再利用

複数のコマンドに類似したフラグを再利用

同様のフラグを使用して複数のコマンドを実行したいとします。たとえば、次のようになります。

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

最初の行にはスペースが含まれているため、引用符が必要です。

スペースで引数を分割するには、引用符なしで変数を使用します。

除外されたディレクトリ名にスペースが含まれている場合はエスケープする必要があります。

関連情報