ソースリストにないターゲットから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にすべてのソースを「結合」し、「--delete」が目的のアクションを実行するように「1つの」ツリーとして処理するように指示するオプションは表示されません。する。しかし、私はこのようなことをしたい最初の人ではないと確信しています。

アイデアはありますか?

ベストアンサー1

複数のソースディレクトリを1つの宛先ディレクトリに同期する場合、この--deleteフラグは明らかに効果がありません。 ANDを同期する代わりに、dir1親ディレクトリの内容を同期できますdir2dir3dir1dir2

はい(-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-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/削除するすべてのディレクトリのプレースホルダとして機能します。

おすすめ記事