Ich möchte rsync verwenden, um ...
- Löschen Sie Dateien auf der empfangenden Seite, die auch auf der sendenden Seite gelöscht wurden
- Löschen Sie keine anderen Dateien, die sich auf der Empfangsseite im Verzeichnis rsynced befinden
Nehmen wir zum Beispiel an, ich habe ein Verzeichnis local-src
:
VORHER: local-src
lokal enthält ...
a.txt
b.txt
c.txt
Mein Remote-Verzeichnis, das ich mit dem Inhalt von local-src
to synchronisieren möchte , wird aufgerufen remote-src
.
VORHER: remote-src
Enthält ...
a.txt
b.txt
c.txt
d.txt
README.md
Angenommen, ich lösche einige Dateien in local-src
:
AFTER LOCAL DELETE: local-src
enthält lokal ...
c.txt
Wie kann ich rsync verwenden, um sicherzustellen, dass die an der Quelle gelöschten Dateien auch am Ziel gelöscht werden, ohne jedoch andere Dateien am Ziel zu löschen? Zum Beispiel möchte ich Folgendes am Zielort haben:
AFTER LOCAL DELETE: remote-src
enthält ...
c.txt
d.txt
README.md
Das heißt, a.txt
und b.txt
werden auch aus der Ferne gelöscht, aber d.txt
und README.txt
werden in Ruhe gelassen.
Gibt es eine Möglichkeit, dies mit rsync zu erreichen?
EDIT: Das Urteil scheint zu sein, dass dies mit rsync unmöglich sein könnte. Ich wurde gefragt, warum ich das brauche, um meinen Anwendungsfall zu veranschaulichen:
Angenommen, ich habe einen Webserver. Auf diesem Webserver habe ich eine Reihe von Verzeichnissen. Nehmen wir an, ich habe ein Verzeichnis A
und ein public_html
Verzeichnis, aus dem meine Site bereitgestellt wird . Angenommen, ich habe einen automatisierten Prozess, der Dateien im Verzeichnis erstellt A
. Ich möchte die generierten oder in das Verzeichnis aktualisierten Dateien rsync (oder mit einem anderen Tool synchronisieren) , ohne andere beliebige Dateien zu löschen, die sich möglicherweise darin befinden . Ich möchte auf keinen Fall, dass rsync meine Website versehentlich löscht.A
public_html
public_html
Wenn rsync nicht das Werkzeug für diesen Job ist, weiß jemand anderes, wie ich das tun kann?
rsync
da nicht festgestellt werden kann, welche Dateien sich bereits im Remote-Ordner befinden. Möglicherweise müssen Sie ein anderes Tool herausfinden.Antworten:
Was Sie tun möchten, ist vernünftig, aber
rsync
es ist nicht sinnvoll, es alleine zu tun. Die Antwort lautet also nein .Der Grund ist einfach: Er
rsync
führt keinen Verlauf dessen, was sich in jedem Verzeichnis befand, und kann nicht wissen, was gelöscht werden muss und was nicht. Nicht ohne zusätzliche Unterstützung.Sie sollten sich fragen, warum Sie dies gerne tun, und dies
rsync
klarer machen. Es gibt andere Programme, dielibrsync1.so
intelligenter sind.Mit den entspannten Einschränkungen, die Sie
rsync
per se nicht benötigen , können Sie sich rdiff-backup ansehen :Dies zeigt
xx
undyy
sind inb
.Dies zeigt
xx
undzz
sind inb
.rdiff-backup
hält auch ein Verzeichnisrdiff-backup-data
inb
so dass Sie alle Änderungen Rollback können, sollten Sie diese in regelmäßigen Abständen spülen , indemrdiff-backup
Befehle. (Das Beispiel ist mit lokalen Dateien, die zeigen, dass zusätzliche Daten im Ziel nicht gelöscht werden, aber rdiff-backup funktioniert auch über ein Netzwerk).Eine andere Alternative besteht darin, ein verteiltes Revisionskontrollsystem (Quecksilber, Basar, Git) einzurichten. Mit mercurial können Sie beispielsweise ein Skript haben (ich verwende dafür ein Makefile), das alle Änderungen auf den Server überträgt und dann die dort ausgecheckten Dateien aktualisiert. Ignorieren Sie alle zusätzlichen Dateien, die sich auf dem Remote-Server befinden (aber haben) nicht unter Revisionskontrolle gestellt).
Auf dem Server würden Sie tun:
Auf dem Client:
Wenn Sie nun eine Datei auf dem Client entfernen und Folgendes tun:
Ihre entfernte Datei wird auf dem Server entfernt, aber alle anderen Daten (nicht zum Repository hinzugefügt) werden nicht gelöscht.
quelle
A
, in dem ein Prozess automatisiert wird und dort automatisch Dateien generiert werden. Ich habe einen Webserver und möchte, dass die darin enthaltenen DateienA
in daspublic_html
Verzeichnis des Webservers synchronisiert werden , natürlich ohne alles andere impublic_html
Ordner des Webservers zu löschen . Wenn jemand Ideen hat, um dies mit einem anderen Tool zu erreichen, wäre dies mehr als willkommen. Ich werde meine Frage aktualisieren, um dies widerzuspiegeln.local-src
Verzeichnis gelöscht wurde, ohne dass ein Prozess dieses Verzeichnis auf Änderungen überwacht. Vielleicht wäre das schwierig.rsync
nicht das Werkzeug. Bitte beachten Sie, dasssync
inrsync
von der Synchronisierung kommt und das nicht genau das ist, was Sie tun möchten. Bei der Entwicklung desrsync
Fokus lag der Schwerpunkt auf einer effizienten (Minimierung) der Datenübertragung. Andere Tools wierdiff-backup
(und möglichcvsup
) haben ihre Techniken dafür verwendet, bauen aber mit zusätzlichen Funktionen darauf auf.Ich denke nicht, dass dies möglich ist, ohne die Dateien auf der Empfangsseite als Teil des Befehls rsync explizit auszuschließen. Siehe den Manpage-Abschnitt für rsync: "PER-DIRECTORY RULES AND DELETE".
quelle
Wenn ich richtig verstanden habe,
--exclude
könnte das das sein, wonach Sie suchen:quelle
Ich habe eine Antwort darauf. Ich denke es funktioniert. Und es funktioniert bei mir. Zuerst sollten Sie
rsync
Dateien in lokale Dateien umwandeln müssen. Dann enthält die lokale Seite alle Dateien.jetzt auf lokaler Seite
Dann können Sie die Dateien löschen oder tun, was Sie wollen (auf lokaler Seite). In Ihrer Frage löschen Sie diese Dateien.
gelöschte Dateien
Danach können Sie
rsync
lokale Dateien auf der Remote-Seite. Dann haben beide Seiten die gleichen Dateien.es gibt
Dateien auf der Remote-Seite und der lokalen Seite. (Durch die Verwendung
--delete
werden andere Dateien auf der Remote-Seite gelöscht , die nicht mit der lokalen Seite übereinstimmen .)quelle