Ich versuche, die --delete
Option in rsync
zu verwenden, um Dateien im Zielverzeichnis zu löschen, die im Originalverzeichnis nicht vorhanden sind
Hier ist der Befehl, den ich benutze:
rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www
Meine Frage ist also, wie kann ich alle Dateien im Zielverzeichnis löschen, die im Originalverzeichnis nicht vorhanden sind?
--recursive
ist überreichlich, weil die Option es-a
bereits enthältIhr Befehl hat nicht funktioniert, da
/var/www/*
Ihre Shell bei der Verwendung als Quelle einen Globbing-Vorgang ausführt, dh, die Shell wird*
auf alle Dateien in diesem Verzeichnis erweitert und die Dateien einzeln kopiert. Daher sind hier einzelne Dateien eher die Quellen als das übergeordnete Verzeichnis.Wenn Sie also verwenden
/var/www/*
, benötigen Sie keine--recursive
Option, da*
die Dateien (zusammen mit allen Verzeichnissen mit ihrem Inhalt) kopiert werden und nicht das übergeordnete Verzeichnis, das die Dateien enthält. Aus dem gleichen Grunde--delete
nicht funktioniert, wie--delete
wird die Dateien aus Ziel entfernen Verzeichnis , die nicht in der Quelle ist Verzeichnis , aber Sie sind das Kopieren von Dateien so dass sie nicht Entfernen von Dateien (expectedly).Dadurch werden Sie klarer:
Wie Sie sehen, habe ich die Quelle verwendet, da der
/foo/*
auszuführendersync
Befehl istMit
*
make shell können Sie es erweitern und alle Dateien einzeln als Quellargumente erstellen, nicht das übergeordnete Verzeichnis als Ganzes (und das brauchen Sie--recursive
in diesem Fall auch nicht ).Wenn Sie also arbeiten möchten
--delete
, führen Sie es wie folgt aus:quelle