Lösung 1:
Entfernen Sie den *
. Wie in den rsync-Manpages erwähnt, ist --delete
Option funktioniert nicht mit Wildcard-Einträgen.
Verwenden Sie stattdessen Folgendes:
rsync -a --delete $DIR1/ $DIR2/
"--deleteThis weist rsync an, irrelevante Dateien von der empfangenden Seite zu löschen (solche, die nicht auf der sendenden Seite sind), aber nur für die Verzeichnisse, die synchronisiert werden. Sie müssen rsync gebeten haben, das gesamte Verzeichnis zu senden ( B. dir
oder dir/
) ohne Verwendung eines Platzhalters für den Inhalt des Verzeichnisses (z. B. dir/*
), da der Platzhalter von der Shell erweitert wird und rsync somit eine Aufforderung erhält, einzelne Dateien zu übertragen, nicht das übergeordnete Verzeichnis der Dateien. Dateien, die von der Übertragung ausgeschlossen sind, sind ebenfalls von der Löschung ausgeschlossen, es sei denn, Sie verwenden den --delete-excluded
Option oder markieren Sie die Regeln als nur auf der Senderseite übereinstimmend (siehe Modifikatoren zum Einschließen/Ausschließen im Abschnitt FILTERREGELN)."
Lösung 2:
Der Grund dafür ist, dass Sie rsync auf /tmp/1/b aufrufen, was die Datei /tmp/1/a überhaupt nicht berücksichtigt.
Ihre Absicht scheint zu sein, das Verzeichnis /tmp/1/ zu synchronisieren -- wenn Sie "/tmp/1/" als Quelle anstelle der einzelnen Dateien verwenden, wird es feststellen, dass "a" aus dem Verzeichnis gelöscht und entfernt wurde es vom Ziel entfernt.
Lösung 3:
Wenn Sie die zweite rsync-Zeile auf rsync -a --delete $DIR1/ $DIR2
ändern (ohne das *) es wird funktionieren. Der Grund ist, dass die Shell den *
erweitert zu den Dateinamen im ersten Verzeichnis, das in Ihrem Fall nur b ist, sodass die fehlende Datei a von rsync überhaupt nicht berücksichtigt wird, da der ausgeführte Befehl tatsächlich rsync -a --delete $DIR1/b $DIR2
ist .