
複数のディレクトリのファイルを 1 つのディレクトリに同期できるようにしたいです。ソース リストからディレクトリを削除すると、そのディレクトリとそのすべてのファイルが宛先からも削除されるようにしたいです。
簡単なサンプルを以下に示します。
mkdir dir1
touch dir1/file1
mkdir dir2
touch dir2/file2
mkdir dir3
rsync -a dir1 dir2 dir3
dir3 には「dir1/file1」と「dir2/file2」が含まれるようになりました。
再度 rsync を実行し、リストから dir2 を削除すると、次のようになります。
rsync -a dir1 dir3
次に、dir2/file2 と dir2 を宛先から削除します。
rsync の --delete オプションは、dir1 と dir3/dir1 間の削除のみを処理するため、dir2 は残ります (--delete を使用している場合でも)。
rsync のマニュアル ページでさまざまなオプションを確認しましたが、rsync にすべてのソースを「結合」して「1 つの」ツリーとして扱い、「--delete」で目的の動作を実行するように指示するオプションは見つかりませんでした。ただし、このような操作をしたいと考えているのは私が初めてではないと確信しています。
アイデアは?
答え1
複数のソース ディレクトリを 1 つの宛先ディレクトリに同期する場合、このフラグは明らかに機能しません。 とを--delete
に同期する代わりに、dir1
との親ディレクトリの内容を同期できます。dir2
dir3
dir1
dir2
例 (rsync フラグを使用して-i
変更を確認する):
$ mkdir -p dir12/dir1 dir12/dir2 dir3
$ touch dir12/dir1/file1 dir12/dir2/file2
$ rsync -ai dir12/ dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
# BEFORE: dir1 and dir2 were synced to dir3
$ rm -rf dir12/dir2
$ rsync -ai --delete dir12/ dir3
*deleting dir2/file2
*deleting dir2/
.d..t...... ./
# AFTER: dir3/dir2 is gone
共通の親ディレクトリがない場合は、dir12/dir2
実際のディレクトリを指すシンボリックリンクである可能性があります。最初の呼び出しでオプション-L
( ) を使用すると、ディレクトリ (シンボリックリンクではなく)と同じディレクトリ構造が取得されます。シンボリックリンクを削除して再度同期すると、例のようにディレクトリは消えます。--copy-links
rsync
dir3
dir2
dir12/dir2
--delete
dir3/dir2
編集:
少しいじってみたら、ハックを見つけたかもしれません:
$ mkdir empty dir1 dir2 dir3
$ touch dir1/file1 dir2/file2
$ rsync -ai dir1 dir2 dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
$ rsync -ai --delete empty/ dir1 dir3
*deleting dir2/file2
*deleting dir2/
.d..t...... ./
empty/
削除するすべてのディレクトリのプレースホルダーとして使用します。