複数のディレクトリのファイルを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にすべてのソースを「結合」し、「--delete」が目的のアクションを実行するように「1つの」ツリーとして処理するように指示するオプションは表示されません。する。しかし、私はこのようなことをしたい最初の人ではないと確信しています。
アイデアはありますか?
答え1
複数のソースディレクトリを1つの宛先ディレクトリに同期する場合、この--delete
フラグは明らかに効果がありません。 ANDを同期する代わりに、dir1
親ディレクトリの内容を同期できますdir2
。dir3
dir1
dir2
はい(-i
変更を表示するにはrsyncフラグを使用してください):
$ 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/
削除するすべてのディレクトリのプレースホルダとして機能します。