一連のサブディレクトリを再同期するにはどうすればよいですか?


9

次のようなソースディレクトリがあります(srcおよびbin dirs内に多数のサブディレクトリがあります)。

  • top_dir
    • proj1
      • src /
      • bin /
      • スクリプト/
      • somefile.txt
    • proj2
      • src /
      • bin /
      • ターゲット
        • bin /
      • file.xml

プロジェクトディレクトリ直下のbinディレクトリだけをrsyncしたい(つまり、top_dir / proj2 / target / bin /を無視する)とその内容を宛先ディレクトリにしたいので、次のようになります:

  • top_dir
    • proj1
      • ビン
    • proj2
      • ビン

include-fromファイルで各binディレクトリ(実際のシナリオでは約15個あります)を明示的にリストすることでおそらく動作させることができますが、すべてのtop_dir /を同期したいという方法があるに違いないと考えていました* / binディレクトリ。

回答:


11

可能性1

rsyncのフィルター規則を使用せず、シェル拡張を使用します*実行できます:

a。階層にすべてのbinディレクトリを含めるにはtop_dir

rsync -av -R top_dir/**/bin/ destination_path

これ-Rは、相対を意味するrsyncパラメータであり、ディレクトリ構造が保持されることを意味します。

**はシェルグロビングパターンであり、のbin下に名前が付けられたディレクトリを再帰的に検索しますtop_dir。上記の例では、コマンドラインは次のように展開されます。

rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path

b。binプロジェクトディレクトリの1レベル下のディレクトリのみを含める場合は、1つだけを使用します*(「古代の」シェルでも機能します!)。

rsync -av -R top_dir/*/bin/ destination_path

*最新のbashバージョン(> 4)が必要で、を介して再帰的グロビングをアクティブにしshopts -s globstarます。zshの再帰グロブデフォルトです。

可能性2

必要なrsyncのフィルタールールのみを使用:

a。階層にすべてのbinディレクトリを含めるにはtop_dir

rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path

最初含めるルールは明白ではないかもしれません+が、すべてのディレクトリが(末尾に注意していることを保証/)検索され、第二は、最終的にすべてのものを追加しbinたディレクトリと除外ルールは、他のすべてを除外します。-m空のディレクトリがコピーされないようにします。

b。プロジェクトディレクトリの下の1レベルのみ:

rsync -av -m  --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path

***rsync> = 2.6.7の構文を使用します。/パターンの先頭はを表しますtop_dir。そうでない場合、パターンはファイルパスの末尾と照合されます。


+検索/some/path/this-file-will-not-be-foundman rsync


可能性1はうまくいきましたが、**を*に変更する必要がありました。入れたくないbinディレクトリがネストされているので、上記の更新されたソースツリーを参照してください。私はzshを持っていますが、これはおそらくzshまたはbashの十分に新しいバージョンを持っていない他の人によって使用されるので、可能性2が機能することを望んでいます。残念ながら、指定したinclude / excludeフィルター式は、少なくともrsync v2.6.9ですべてに一致するようです。
マットパッセル14年

実際、可能性2のフィルター式は、私が思っていたよりも近いです。それらにはすべてのディレクトリが含まれていましたが、非ビンディレクトリ内のファイルは含まれていませんでした。-mを追加すると、ほぼ正しいです。このコマンドにrsync -avm --include='**/' --include='**/bin/**' --exclude='*' top_dir/ dest_dirは、ネストされたビンディレクトリが含まれています。2番目のパターンを'*/bin/**'またはに変更した場合でも'bin/**'、ネストされたビンdirを取得します。
マットパッセル14年

@MattPassellその後、私は間違いなくPossを使用します。1. 現在使用されているすべての Un * xシェルで*動作するはずです。適切なrsyncルールで回答を更新しました。
mpy 14年

0

srcを使用してすべてのディレクトリを除外できます--exclude src/


ごめんなさい。私はそこに他のディレクトリとファイルがあることを明確にしていませんでした。ファイルツリーを編集して、それを明確にしました。
マットパッセル14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.