rsync synchronisiert nur Dateien, ohne Ordner am Ziel zu erstellen

rsync synchronisiert nur Dateien, ohne Ordner am Ziel zu erstellen

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 Aund Beinem lokalen Laufwerk C.
  • Normalerweise verwende ich es rsynczum Synchronisieren (und Zusammenführen) von Remote- Aund Blokalen Daten C.
  • CDann möchte ich manchmal einfach nur einige Dateien zurück in Aund synchronisieren B. (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.fileangeben, 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.

verwandte Informationen