サブディレクトリのセットを rsync するにはどうすればいいですか?

サブディレクトリのセットを rsync するにはどうすればいいですか?

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

  • トップディレクトリ
    • プロジェクト1
      • ソース/
      • 置き場/
      • スクリプト/
      • 何らかのファイル.txt
    • プロジェクト2
      • ソース/
      • 置き場/
      • 目標
        • 置き場/
      • ファイル.xml

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

  • トップディレクトリ
    • プロジェクト1
      • 置き場
    • プロジェクト2
      • 置き場

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

答え1

可能性1

のフィルタ ルール の代わりにシェル拡張1を使用すると、次の操作を実行できます。rsync

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

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

これは-Rrsync 2のパラメータであり、相対的.man rsyncは次のように説明しています

相対パスを使用します。これは、ファイル名の最後の部分だけではなく、コマンド ラインで指定された完全なパス名がサーバーに送信されることを意味します。これは、複数の異なるディレクトリを同時に送信する場合に特に便利です。

しかし、本質的にはディレクトリ構造が保持されることを意味します。

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

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

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

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

1最近のバッシュバージョン(>4)で、再帰グロブを有効にしますshopts -s globstar翻訳再帰的なグロブがデフォルトです。

2 Linux 上の rsync バージョン v3.2.3 プロトコル バージョン 31。

可能性2

rsync のフィルター ルールのみを使用する場合、次のものが必要です。

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

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

最初のincludeルールは明らかではないかもしれませんが3、すべてのディレクトリ (末尾の に注意/) が検索されることを保証し、2 番目のルールはbinディレクトリ内のすべてを追加し、excludeルールは他のすべてを除外します。-m空のディレクトリがコピーされないようにします。

b. プロジェクト ディレクトリの 1 レベル下のレベルのみを含めるには:

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

rsync >= 2.6.7の構文を使用します。パターンの***先頭は を表し、それ以外の場合はパターンは/top_dir終わりファイル パスの。


3検索/some/path/this-file-will-not-be-foundするman rsync

答え2

srcすべてのディレクトリを除外するには、--exclude src/

関連情報