サーバー1にそのようなディレクトリ構造があります:
そして、このフォルダー構造をサーバー2に複製しますが、unique_folder1のディレクトリ/サブディレクトリのみをコピーします。つまり結果として:
rsync
がこれに非常に適していることは知っています。成功せずに「含める/除外する」オプションを試しました。
例えば。私はもう試した:
rsync -avzn --list-only --include '*/unique_folder1/**' --exclude '*' -e ssh [email protected]:/path/to/old/data/ /path/to/new/data/
しかし、結果として、ファイル/ディレクトリは表示されません。
receiving file list ... done
sent 43 bytes received 21 bytes 42.67 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
どうしましたか?アイデア?
追加情報:両方のサーバーへのSudoアクセスがあります。私が持っているアイデアの1つは、find
コマンドとcpio
を一緒に使用して、必要なコンテンツを含む新しいディレクトリにコピーし、その後Rsync
を使用することです。しかし、これは非常に遅く、多くのファイルなどがあります。
その理由を見つけました。私に関しては、Rsync
がこのように機能することは明らかではありませんでした。
だから正しいコマンド(company1
ディレクトリのみ)は以下でなければなりません:
rsync -avzn --list-only --include 'company1/' --include 'company1/unique_folder1/***' --exclude '*' -e ssh [email protected]:/path/to/old/data/ /path/to/new/data
つまり各親company
ディレクトリを含める必要があります。そしてもちろん、これらすべてのcompany
ディレクトリをコマンドラインで手動で書き込むことはできないため、リストをファイルに保存して使用します。
1.サーバー1でインクルードファイルを生成します。そのため、そのコンテンツは次のようになります(ls
とawk
を使用しました)。
+ company1/
+ company1/unique_folder1/***
...
+ companyN/
+ companyN/unique_folder1/***
2. include.txtをサーバー2にコピーし、次のコマンドを使用します。
rsync -avzn \
--list-only \
--include-from '/path/to/new/include.txt' \
--exclude '*' \
-e ssh [email protected]:/path/to/old/data/ \
/path/to/new/data
最初に一致するパターンがディレクトリを除外する場合、そのすべての子孫は走査されません。深いディレクトリを含める場合(例: company*/unique_folder1/**
ただし、他のすべてを除外*
、先祖もすべて含めるようにrsyncに指示する必要があります。
rsync -r -v --dry-run \
--include='/' \
--include='/company*/' \
--include='/company*/unique_folder1/' \
--include='/company*/unique_folder1/**' \
--exclude='*'
Bashのブレース展開を使用して、入力を節約できます。中括弧の展開後、次のコマンドは前のコマンドとまったく同じです。
rsync -r -v --dry-run --include=/{,'company*/'{,unique_folder1/{,'**'}}} --exclude='*'
たとえば、_target/classes/
_と_target/lib/
_のみをリモートシステムに同期する場合は、次のようにします。
_rsync -vaH --delete --delete-excluded --include='classes/***' --include='lib/***' \
--exclude='*' target/ user@Host:/deploy/path/
_
見るべき重要なもの:
/
_」を忘れないでください。そうしないと、サブディレクトリにコピーが作成されます。--include
_、_--exclude
_の順序がカウントされます。/
_」で始まる他の回答に反して、包含/除外パラメーターは不要であり、ソースディレクトリに自動的に追加されます(例では_target/
_)。--dry-run
_フラグを使用できます。--delete-excluded
_ ターゲットディレクトリ内のすべてのコンテンツを削除します。ただし、具体的に含めたサブディレクトリは除きます。賢明に使用する必要があります!このため、_--delete
_は十分ではありません。デフォルトではリモート側の除外ファイルを削除しません(他のすべて、はい)。通常の_--delete
_の横に再度指定する必要があります。