2016-06-30 6 views
1

問題:Zshスクリプトからrsyncを呼び出すと、特定の拡張子セットの1つを持つファイルを除外するようにrsyncに指示します。私がこれをやっているやり方は次のとおりです。rsyncによってコピーされる特定の拡張子セットを含むファイルを除外する

rsync -r --exclude '*.bak' --exclude '*.save' --exclude '*.backup' --exclude '*.old' ... from_directory/* to_directory 

これは面倒ですが、コマンドラインは非常に長くなります。私は代替

# THIS DOES NOT WORK: 
rsync -r --exclude '*.bak' --exclude '*.{save,backup,old,...}' from_directory/* to_directory 

と試みたが、これは動作しません - rsyncにもシェル・レベルで、これはグロブファイルの一部ではないので、本当に驚くべきことではないである(中括弧を使用して、短いカットを処理していませんがコマンドラインの解釈の初期段階で発生します)。

ファイルに除外するすべてのパターンを書き込んで、--excludeの代わりに--exclude-listを使用することも考えました。これはうまくいくはずですが、このソリューションが気に入らないのは、自分のスクリプトが自己完結型であること、つまりファイルパターンが別のファイルではなくスクリプト内に表示されたかったからです。もちろん

は常に一時ファイルを作成するためのソリューション、拡張子を含むHERE文書使用してあります:

cat <<<LIST >excluded.txt 
*.bak 
*.save 
... etc 
LIST 
rsync -r --exclude-list excluded.txt .... 
rm excluded.txt 

を私はいくつかの巧妙な使用のいずれかによって、よりエレガントな解決策があるかどうかを疑問に思いますrsyncオプション、または一時ファイルの処理を容易にするZsh機能によって実行されます。

答えて

2

引用符で囲んだ中かっこの中括弧拡張(foo{a,b,c}barfooabar foobbar foocbar)が行われていないため、試行した選択肢が機能しません。

代わりに以下を試してください。

rsync -r --exclude='*'.{bak,save,backup,old} from_directory/* to_directory 

トリックだけ*を引用し、--excludeオプションの値も=代わりのスペースで分離させることができるという事実を使用することです。 zshが一つの単語としてそれを認識し、

--exclude='*'.{bak,save,backup,old} 

--exclude='*'.bak --exclude='*'.save --exclude='*'.backup --exclude='*'.old 
に展開されますその方法
関連する問題