rsync でソース リストにないディレクトリを宛先から削除する方法

rsync でソース リストにないディレクトリを宛先から削除する方法

複数のディレクトリのファイルを 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との親ディレクトリの内容を同期できます。dir2dir3dir1dir2

例 (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-linksrsyncdir3dir2dir12/dir2--deletedir3/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/削除するすべてのディレクトリのプレースホルダーとして使用します。

関連情報