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"?
Antworten:
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.
quelle
Entfernen Sie die
*
. Wie in den rsync-Manpages erwähnt,--delete
funktioniert die Option nicht mit Platzhaltereinträgen.Verwenden Sie dies stattdessen:
"--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.
dir
oderdir/
) ohne eine Wildcard für das Inhalt des Verzeichnisses (zB mitdir/*
) , 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-excluded
Option oder markieren die Regeln als nur übereinstimmend auf der sendenden Seite (siehe die Modifizierer include / exclude im Abschnitt FILTER RULES). "quelle
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 istrsync -a --delete $DIR1/b $DIR2
.quelle