
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 --delete
Flag funktioniert offensichtlich nicht, wenn Sie mehrere Quellverzeichnisse mit einem Zielverzeichnis synchronisieren. Anstatt dir1
und dir2
mit zu synchronisieren dir3
, könnten Sie den Inhalt des übergeordneten Verzeichnisses von dir1
und synchronisieren dir2
.
Beispiel (mit dem rsync-Flag, -i
um 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/dir2
könnte ein Symlink auf das reale Verzeichnis verweisen. Mit option -L
( --copy-links
) im ersten rsync
Aufruf würde man die gleiche Verzeichnisstruktur dir3
wie dir2
im Verzeichnis erhalten (anstelle eines Symlinks). Und nach dem Löschen des Symlinks dir12/dir2
und erneutem Synchronisieren mit wäre --delete
das Verzeichnis dir3/dir2
wie 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.