
次のようなソース ディレクトリがあります (src ディレクトリと bin ディレクトリ内に多数のサブディレクトリがあります)。
- トップディレクトリ
- プロジェクト1
- ソース/
- 置き場/
- スクリプト/
- 何らかのファイル.txt
- プロジェクト2
- ソース/
- 置き場/
- 目標
- 置き場/
- ファイル.xml
- プロジェクト1
プロジェクト ディレクトリの直下にある bin ディレクトリ (つまり、top_dir/proj2/target/bin/ は無視) とその内容のみを宛先ディレクトリに rsync したいので、次のようになります。
- トップディレクトリ
- プロジェクト1
- 置き場
- プロジェクト2
- 置き場
- プロジェクト1
おそらく、include-from ファイルに各 bin ディレクトリ (実際のシナリオでは約 15 個あります) を明示的にリストすることで動作させることができると思いますが、すべての top_dir/*/bin ディレクトリを同期したいと指定する方法があるはずだと考えていました。
答え1
可能性1
のフィルタ ルール の代わりにシェル拡張1を使用すると、次の操作を実行できます。rsync
a.階層bin
内のすべてのディレクトリを含めるにはtop_dir
:
rsync -av -R top_dir/**/bin/ destination_path
これは-R
rsync 2のパラメータであり、相対的.man rsync
は次のように説明しています
相対パスを使用します。これは、ファイル名の最後の部分だけではなく、コマンド ラインで指定された完全なパス名がサーバーに送信されることを意味します。これは、複数の異なるディレクトリを同時に送信する場合に特に便利です。
しかし、本質的にはディレクトリ構造が保持されることを意味します。
**
はシェルのグロブパターンであり、bin
の下で名前が付けられたディレクトリを再帰的に検索しますtop_dir
。したがって、上記の例では、コマンド ラインは次のように展開されます。
rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path
bin
b.プロジェクト ディレクトリの 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/