2012-06-20 3 views
39

次のbashスクリプトを使用して、特定の拡張子(この場合は* .sh)のファイルのみをコピーします。どうしましたか?rsyncは、includeオプションを使用して特定のタイプのファイルのみをコピーします。

 
from=$1 
to=$2 

rsync -zarv --include="*.sh" $from $to 
+3

を厳密に言い表せませんが、$ from/$ toを引用することをお勧めします。位置引数1/2にスペースが含まれていると、そうしないと予期しない結果になることがあります。 –

答えて

63

私は--includeはそうではなくファイルのみを含むよりも、--excludeによって除外されているファイルのサブセットを含めるために使用されていると思います。

代わり試し:

rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to" 

UPDATE次のよう3.0.7よりもrsyncのバージョンの

、順序を変更する必要がある(コメントを参照)

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to" 

更新
'-m'フラグを追加すると、avo idは、宛先に空のディレクトリ構造を作成します。バージョン3.1.2でテストされています。

+9

それはすべてのサブディレクトリを取得しますが、rsyncを実行するサブディレクトリに.shファイルがある場合、--include = "* /"も使用する可能性があります。 –

+34

私はmacportsからずっと前に得たrsyncバージョン3.0.7でこれを試しましたが、このinclude/excludeの注文ではうまくいきませんでした。これは私が私のために働いた(OPに適合した)ものです: 'rsync -zarv --include =" */"--include =" * .sh "--exclude =" * "" $ from "" $を "に設定します。 –

+0

Bijouの提案が有効です。答えを更新してもらえますか? – Jepper

8

つ以上の付加:中ドットにあなたの注意を払う

rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/ 

:あなただけ(再帰のなし)1つのdirの中でその拡張子によってファイルを同期する必要がある場合には、このような工事を使用する必要があります最初の--include--no-rはこの構成では機能しません。

21

@chepnerの回答は、ファイルが含まれているかどうかにかかわらず、すべてのサブディレクトリをコピーします。ファイルを含んでいないサブディレクトリを除外してディレクトリ構造を保持する必要がある場合は、

rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to" 
+0

この回答は私のために完璧に働いた。 +1 :) – Terry

+1

これは私にとっては必要条件でした。「ファイルが含まれていないサブディレクトリを除外して、ディレクトリ構造を保持する必要がある場合は+1」 –