So lassen Sie rsync Verzeichnisse vom Ziel löschen, die nicht in der Quellliste enthalten sind

So lassen Sie rsync Verzeichnisse vom Ziel löschen, die nicht in der Quellliste enthalten sind

Ich möchte Dateien aus mehreren Verzeichnissen in ein Verzeichnis synchronisieren können. Wenn ich ein Verzeichnis aus der Quellliste entferne, möchte ich, dass dieses Verzeichnis und alle darin enthaltenen Dateien aus dem Ziel entfernt werden.

Hier ist ein kurzes Beispiel:

mkdir dir1
touch dir1/file1
mkdir dir2
touch dir2/file2
mkdir dir3
rsync -a dir1 dir2 dir3

dir3 enthält jetzt „dir1/file1“ und „dir2/file2“.

Wenn ich erneut rsync ausführe und dir2 aus der Liste entferne:

rsync -a dir1 dir3

Dann möchte ich, dass dir2/file2 und dir2 aus dem Ziel entfernt werden.

Die Option --delete für rsync verarbeitet nur Löschungen zwischen dir1 und dir3/dir1, daher bleibt dir2 erhalten (auch bei Verwendung von --delete).

Ich habe mir die verschiedenen Optionen auf der Manpage für rsync angesehen und kann keine Option finden, die rsync anweist, alle Quellen zu „kombinieren“ und sie als „einen“ Baum zu betrachten, sodass „--delete“ das bewirkt, was ich möchte. Ich bin mir jedoch ziemlich sicher, dass ich nicht der Erste bin, der so etwas tun möchte.

Ideen?

Antwort1

Das --deleteFlag funktioniert offensichtlich nicht, wenn Sie mehrere Quellverzeichnisse mit einem Zielverzeichnis synchronisieren. Anstatt dir1und dir2mit zu synchronisieren dir3, könnten Sie den Inhalt des übergeordneten Verzeichnisses von dir1und synchronisieren dir2.

Beispiel (mit dem rsync-Flag, -ium die Änderungen anzuzeigen):

$ 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

Wenn kein gemeinsames übergeordnetes Verzeichnis vorhanden ist, dir12/dir2könnte ein Symlink auf das reale Verzeichnis verweisen. Mit option -L( --copy-links) im ersten rsyncAufruf würde man die gleiche Verzeichnisstruktur dir3wie dir2im Verzeichnis erhalten (anstelle eines Symlinks). Und nach dem Löschen des Symlinks dir12/dir2und erneutem Synchronisieren mit wäre --deletedas Verzeichnis dir3/dir2wie im Beispiel verschwunden.

BEARBEITEN:

Ich habe ein bisschen herumprobiert und möglicherweise einen Hack gefunden:

$ 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...... ./

Verwenden Sie es empty/als Platzhalter für alle Verzeichnisse, die Sie löschen möchten.

verwandte Informationen