rsync Kopieren von Verzeichnisinhalten nicht rekursiv

8

Ich versuche, den Inhalt einer Reihe von Verzeichnissen nicht rekursiv auf ein anderes Remote-System zu kopieren.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1, dir2 und dir3 enthalten viele Verzeichnisse, die ich nicht kopieren möchte. Kopieren Sie auf dem Remote-Host nach / dirB und behalten Sie dabei die gleiche Verzeichnisstruktur bei.

Ich habe es versucht:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Aber sie machen nicht was ich will.

Felipe Alvarez
quelle

Antworten:

20

Mit rsync können Sie Muster angeben, die das Einschließen oder Ausschließen von Dateien und Verzeichnissen auslösen. Ich denke, Sie möchten so etwas verwenden:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Erläuterung:

  • -aLöst den Archivierungsmodus aus, der sowohl die Rekursion als auch die Beibehaltung von "symbolischen Links, Geräten, Attributen, Berechtigungen, Besitzverhältnissen usw." aktiviert man rsync.
  • -fist die Abkürzung für --filter=, die eine Dateifilterregel hinzufügt.
    • Das Muster befindet sich in einfachen Anführungszeichen, damit die Shell keine Platzhalter erweitert. doppelte Anführungszeichen würden in diesem Fall genauso gut funktionieren.
    • - bedeutet, dass dies ein Ausschlussmuster ist.
    • Das führende /bedeutet, dass das Muster bei beginnen muss dirA/(der rsync "Transfer-Root").
    • Der */*Teil des Musters bezieht sich auf alles innerhalb eines Unterverzeichnisses.
    • Das Trailing /beschränkt den Ausschluss auf Verzeichnisse. Dateien in einem Unterverzeichnis von dirA/sind nicht betroffen.

Am Ende kopiert rsync also nur eine Ebene nach unten (und erstellt auch keine Verzeichnisse der zweiten Ebene).

PleaseStand
quelle
2
Sehr schön! Ich konnte mich -f '- /*/'nur auf Dateien der obersten Ebene beschränken. Ich musste auch angeben -f '- .*', um Punktdateien auszuschließen, da ich ein Home-Verzeichnis synchronisierte.
Haridsv
5

Die obige Lösung (von PleaseStand) hat aus irgendeinem Grund bei mir nicht funktioniert. Dies funktionierte jedoch:

rsync -avc --no-r ./source/* ./destination/

Es gibt auch diese Alternative:

rsync -avc --exclude "/" ./source/ ./destination/

Andrei Pokrovsky
quelle
1

Eine der "Funktionen" von rsync ist das Analysieren von Verzeichnissen.

rsync /dirA/ host:/dirB/ und rsync /dirA host:/dirB sollte theoretisch gleichwertig sein.

Um die Rekursivität nicht zu fördern, möchten Sie vermeiden -r, -awas neben anderen Dingen impliziert -r.

Ich bin noch nicht ganz mit der Forschung fertig, aber dies ist meine erste Antwort.

Mörder
quelle