rsync löscht keine Dateien auf dem Ziel

22

Ich versuche, ein Verzeichnis zu spiegeln, das sich mit der Zeit in ein anderes Verzeichnis ändert. Mein Problem ist, dass rsync keine Dateien auf dem Ziel löscht, wenn sie nicht mehr im Quellverzeichnis vorhanden sind. Hier ist ein Demo-Skript:

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

Hier ist die Ausgabe:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

Wie Sie sehen können, ist die Datei "a" nach der zweiten Ausführung von rsync immer noch im Zielverzeichnis vorhanden, was ich nicht benötige. Missbrauche ich die Option "--delete"?

halp
quelle
Achten Sie auf / * am Ende der Quellverzeichnisse. Dadurch berücksichtigt rsync nur diese Dateien und nicht das Verzeichnis selbst (und das Fehlen von Dateien, die nicht mehr existieren).
Walt Stoneburner

Antworten:

9

Der Grund dafür ist, dass Sie rsync unter / tmp / 1 / b aufrufen, wodurch die Datei / tmp / 1 / a überhaupt nicht berücksichtigt wird.

Ihre Absicht scheint darin zu bestehen, das Verzeichnis / tmp / 1 / zu synchronisieren. Wenn Sie "/ tmp / 1 /" anstelle der einzelnen Dateien als Quelle verwenden, wird festgestellt, dass "a" aus dem Verzeichnis gelöscht und entfernt wurde es aus dem Ziel.

Eric
quelle
23

Entfernen Sie die *. Wie in den rsync-Manpages erwähnt, --deletefunktioniert die Option nicht mit Platzhaltereinträgen.

Verwenden Sie dies stattdessen:

rsync -a --delete $DIR1/ $DIR2/

"--delete Dies weist rsync an, externe Dateien von der empfangenden Seite zu löschen (solche, die sich nicht auf der sendenden Seite befinden), aber nur für die Verzeichnisse, die synchronisiert werden. Sie müssen rsync aufgefordert haben, das gesamte Verzeichnis zu senden (z. B. diroder dir/) ohne eine Wildcard für das Inhalt des Verzeichnisses (zB mit dir/*) , da die Platzhalter von der Shell expandiert und rsync erhalten somit eine Anforderung , einzelne Dateien zu übertragen, nicht die übergeordnete Verzeichnis Dateien. Dateien , die von der Übertragung ausgeschlossen sind , werden auch vom Wesen ausgeschlossen gelöscht, es sei denn, Sie verwenden die --delete-excludedOption oder markieren die Regeln als nur übereinstimmend auf der sendenden Seite (siehe die Modifizierer include / exclude im Abschnitt FILTER RULES). "

Sameer
quelle
Dies ist funktional das gleiche wie die Antwort von Sven aus dem Jahr 2011.
Rowan Hawkins
8

Wenn Sie die zweite rsync-Zeile in rsync -a --delete $DIR1/ $DIR2(ohne *) ändern, funktioniert dies. Der Grund dafür ist, dass die Shell *das Kommando auf die Dateinamen im ersten Verzeichnis erweitert, was in Ihrem Fall nur b ist, so dass die fehlende Datei a von rsync überhaupt nicht berücksichtigt wird, da der Befehl, der ausgeführt wird, tatsächlich ist rsync -a --delete $DIR1/b $DIR2.

Sven
quelle