Fremddateien aus Zielverzeichnis über rsync löschen?

51

Sagen wir, ich habe

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Es entfernt hello.jpg nicht von DEST. Irgendeine Idee, wie man das archiviert?

Cheng
quelle

Antworten:

72

Der Grund, warum Ihr Befehl nicht funktioniert, wird in der Handbuchseite für rsync erläutert (Hervorhebung hinzugefügt):

--löschen

Dadurch wird rsync angewiesen, nicht benötigte Dateien auf der empfangenden Seite (nicht auf der sendenden Seite) zu löschen, sondern nur für die Verzeichnisse, die synchronisiert werden. Sie müssen rsync aufgefordert haben, das gesamte Verzeichnis zu senden (z. B. "dir" oder "dir /"), ohne einen Platzhalter für den Inhalt des Verzeichnisses zu verwenden (z. B. "dir / *"), da der Platzhalter durch die Shell erweitert wird und rsync somit einen erhält Anforderung, einzelne Dateien zu übertragen, nicht das übergeordnete Verzeichnis der Dateien. Dateien, die von der Übertragung ausgeschlossen sind, werden ebenfalls nicht gelöscht, es sei denn, Sie verwenden die Option --delete-excluded oder markieren die Regeln als nur auf der sendenden Seite zutreffend (siehe die Modifizierer include / exclude im Abschnitt FILTER RULES).

Also, wenn du rennst

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

Die unerwünschten Dateien in DEST werden nicht gelöscht, da Sie nicht nach einem zu synchronisierenden Verzeichnis gefragt haben, sondern nur nach einer Handvoll bestimmter Dateien. Versuchen Sie Folgendes, um die gewünschten Ergebnisse zu erzielen:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Beachten Sie, dass die Reihenfolge der Einschluss- und Ausschlussrichtlinien von Bedeutung ist. Im Wesentlichen wird jede Datei in der angegebenen Reihenfolge mit den Einschluss- oder Ausschlussmustern verglichen. Daher werden Dateien mit den Erweiterungen .jpg oder .txt synchronisiert, da sie mit den "eingeschlossenen" Mustern übereinstimmen, bevor sie mit dem ausgeschlossenen "*" Muster übereinstimmen. Alles andere wird durch das --exclude '*'Muster ausgeschlossen. Die --delete-excludedOption stellt sicher, dass auch ausgeschlossene Dateien auf der DEST-Seite gelöscht werden.

Steven D
quelle
@Cheng, möchten Sie etwas mehr erklären? Ich würde gerne meine Antwort aktualisieren, wenn es ein Problem / eine Verbesserung gibt.
Steven D
Es klappt. Ich vermute. Die --Prozesssachen verwirren mich, lassen mich denken, dass es wieder übertragen wurde.
Cheng
Ich habe meine Antwort bearbeitet, um etwas mehr zu erklären.
Steven D
2
@Cheng: Ich vermute, du willst das nicht --delete-excluded. Ohne es nur *.jpgund *.txtkann auf der Zielseite gelöscht werden. Damit würden auch nicht verwandte Dateien gelöscht. Dieses Tutorial zu Rsync-Filtern könnte Sie interessieren .
Gilles 'SO - hör auf böse zu sein'
3
Vielen Dank! Mir hat der abschließende Schrägstrich im Quellverzeichnis gefehlt.
Vaughan