Ist es mit rsync möglich, am Ziel keine Verzeichnisse zu erstellen?
Stellen Sie sich vor, ich habe diese Quelle:
a/
a/x.txt
b/
b/y.txt
Und dass ich dieses Ziel habe:
a/
a/z.txt
Das gewünschte Ergebnis von rsync source destination
:
a/
a/x.txt
a/z.txt
Natürlich umfasst meine tatsächliche Situation eine Struktur mit Tausenden von Dateien/Ordnern und ich möchte keine Lösungen mit einer expliziten Liste synchronisierter Ordner, was ich aber tun kann.Ich suche nach einer sauberen Möglichkeit, die Erstellung jeglicher Ordner am Ziel zu verhindern.Durch Ausschließen oder Filtern ... Das könnte sogar etwas außerhalb von rsync sein, wie ein Hack mit Berechtigungen, wenn rsync dies nicht kann ...
Zur Information: Solche Situationen können ganz leicht auftreten. In meinem Fall ist es so:
- Ein Server mit beispielsweise 2 Festplatten
A
undB
einem lokalen LaufwerkC
. - Normalerweise verwende ich es
rsync
zum Synchronisieren (und Zusammenführen) von Remote-A
undB
lokalen DatenC
. C
Dann möchte ich manchmal einfach nur einige Dateien zurück inA
und synchronisierenB
. (Nur neue Dateien... keine nicht vorhandenen Ordner am Ziel)
Antwort1
Versuche Folgendes:
rsync -av src:/dir/to/files/* /dest/dir
Wenn Sie mehrere verschachtelte Unterverzeichnisse haben, müssen Sie zunächst Folgendes tun:
find /dir/to/files -type d -print
Führen Sie diese Verzeichnisliste durch eine Schleife und rufen Sie jedes Mal rsync auf. Vorausgesetzt, Sie tun dies auf einem Remotecomputer, müssen Sie natürlich die Suche über SSH ausführen, die Ergebnisse in einem Array speichern und dann die rsync-Schleife ausführen.
Antwort2
Ich habe dies jetzt für rsync implementiert und den Patch an Upstream übermittelt: https://lists.samba.org/archive/rsync/2015-November/030455.html
Antwort3
vielleicht ein normales rsync durchführen und dann im zweiten Schritt alle neu erstellten Ordner löschen ... klingt gefährlich.
Um die Sicherheit dieser Operation zu erhöhen, können Sie einen anderen Benutzer als den auf dem Zielsystem verwenden:
rsync $src $specialuser@server:$destination
Löschen der von diesem Benutzer remote erstellten Ordner:
ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"
Und setzen Sie dann die Berechtigungen wieder auf den Normalwert:
ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"
verdammt, das sieht schmutzig aus ... das muss dringend verbessert werden :D
Antwort4
Ich empfehle die Erstellung einer include_file-Datei auf Ihrem Ziel mithilfe eines Skripts, um /*
an jede Zeile des Ergebnisses Folgendes anzuhängen:
find [Zielverzeichnis] -type d >[Zielverzeichnis]/include.file
Anschließend können Sie mithilfe von rsync --include_file=[target_dir]/include.file
angeben, dass nur die Dateien eingeschlossen werden sollen, die einem Muster in dieser Datei entsprechen. Dabei sollte es sich um eine vollständige Liste der Ordner auf dem Ziel unter dem von Ihnen angegebenen Punkt handeln.
Wenn Sie ein Skript erstellen, das dies jedes Mal ausführt, ist Ihre Liste in include.file immer aktuell. Andernfalls können Sie sie gelegentlich aktualisieren (eines auf jedem Server, zu dem Sie per rsync zurückkehren möchten).
Wenn ich später Zeit habe, werde ich hier ein verwendbares Python-Skript posten, aber das hier sollte Ihnen einen guten Weg nach vorne weisen.