Frage zu --exclude bei rsync
Pit
- webserver
Hallo,
ich würde gerne eine Reihe von Verzeichnissen per rsync auf einen anderen Server spiegeln:
rsync -azv myRoot/ entfernter.server:verz/unterverz/
Die zu spiegelnden Verzeichnisse unterhalb von myRoot sind z.b:
verz1
sub1
sub2
...
verz2
sub1
sub2
...
verz3
sub1
sub2
...
verz4
sub1
sub2
...
...
sub1
sub2
...
Kann ich meinem rsync-Befehl einen Zusatz (--exclude?) mitgeben, dass alles gespiegelt werden soll, aber das jeweilige Verzeichnis "sub2" hiervon ausgeschlossen wird?
Vielleicht so was in dieser Art?
rsync -azv myRoot/ --exclude */sub2 entfernter.server:verz/unterverz/ ???
Pit
Hallo Pit,
Sollte also funktionieren, aber die --exclude Option muss vor der Angabe der Quelle stehen.
Rolf
Hallo Pit,
Sollte also funktionieren, aber die --exclude Option muss vor der Angabe der Quelle stehen.
Hallo Rolf,
danke für den Hinweis... und ja, es hat funktioniert. 😀
Noch eine Frage: Gibt es irgendeinen Befehl, mit dem ich (zuvor) alle "sub2", die ich beim synchronisieren ausgelassen habe, mitsamt ihrer Verzeichnisstruktur (nur eben ohne die Dateien in den Verzeichnissen - bis auf die Dateien in sub2) in einen anderen Ordner kopieren kann?
Pit
Hallo Pit,
äh, ich habe von Unix keine Ahnung? Ich kann nur googlen 😂
Aber unabhängig davon habe ich nicht verstanden, was Du tun willst. Kannst Du das an einem Beispiel illustrieren? Was soll kopiert werden, was nicht?
Rolf
Hallo Pit,
äh, ich habe von Unix keine Ahnung? Ich kann nur googlen 😂
Aber unabhängig davon habe ich nicht verstanden, was Du tun willst. Kannst Du das an einem Beispiel illustrieren? Was soll kopiert werden, was nicht?
Hallo Rolf,
als Beispiel würde ich gerne, ausgehend von meinem Beispiel:
Root:
verz1
sub1
sub2
...
verz2
sub1
sub2
...
verz3
sub1
sub2
...
verz4
sub1
sub2
...
...
sub1
sub2
...
einen Befehl folgender Art durchführen:
Durchsuche das Root-Verzeichnis rekursiv nach "sub2-Verzeichnissen" und speichere mir (inkl. Pfad) den Inhalt im Verzeichnis (ausgehend vom Root) verz1/alleSub2
.
Pit
einen Befehl folgender Art durchführen:
Durchsuche das Root-Verzeichnis rekursiv nach "sub2-Verzeichnissen" und speichere mir (inkl. Pfad) den Inhalt im Verzeichnis (ausgehend vom Root)
verz1/alleSub2
.
find -name sub2
listet genau auf, was ich gerne hätte, aber
find -name sub2 -exec cp -r {} /path/to/myDir \;
speichert nicht genau, was ich möchte, sondern viel weniger... warum?
Pit
find -name sub2 -exec cp -r {} /path/to/myDir \;
speichert nicht genau, was ich möchte, sondern viel weniger... warum?
... ah, ok. Es gibt noch eine --parents Option.
find -name sub2 -exec cp -r --parents {} /path/to/myDir \;
Damit klappt es 😀
Pit
Und der Vollständigkeit halber, falls jemand hier mal nachliest:
find . -name sub2 ! -path "./my_dest/*" -exec cp -r --parents {} /path/to/my_dest \;
find . = vom aktuellen Verzeichnis
-name sub2 = zu suchendes verzeichnis
! -path "./my_dest/*" = zu übergehendes Verzeichnis
Rest = selbsterklärend
Pit
Hallo,
find . -name sub2 ! -path "./my_dest/*" -exec cp -r --parents {} /path/to/my_dest \;
Soweit, so gut.
Jetzt würde ich diesen Einzeiler gerne so erweitern, dass nur die "sub2-Verzeichnisse" ermittelt werden, deren Inhalt (egal welche Verzeichnisstiefe) in den letzten X Minuten geändert wurde.
Ich habe schon "zig" Versuche mit ctime, cmin, usw. hinter mir, aber es will mir nicht gelingen.
Wer kann mir hier helfen und obige Zeile entsprechend ergänzen (falls mein Vorhaben überhaut möglich ist)?
Pit
man find
says:
-mmin n
File's data was last modified n minutes ago.
Das gilt auch für Verzeichnisse.
Übrigens: Wenn Du NUR Verzeichnisse finden willst, dann solltest Du noch
-type d
hinzufügen.
man find
says:-mmin n File's data was last modified n minutes ago.
Das gilt auch für Verzeichnisse.
Übrigens: Wenn Du NUR Verzeichnisse finden willst, dann solltest Du noch
-type d
hinzufügen.
Hallo ursus,
Du hast Recht, aber ich habe diese optionen bereits alle versucht und bekomme dennoch kien korrektes ergebnis.
Hiermit finde ich rekursiv alle "sub2-Verzeichnisse"
ausgehend vom aktuellen Verzeichnis.
Diese werden dann ebenso rekursiv mitsamt Inhalt ins Verzeichnis /path/to/my_dest
kopiert:
find . -name sub2 ! -path "./my_dest/*" -exec cp -r --parents {} /path/to/my_dest \;
Da das aber recht viele Ergebnisse sind, würde ich die Ergebnisse gerne dergestalt reduzieren, dass nur noch rekursiv alle "sub2-Verzeichnisse"
gefunden und/oder kopiert werden, innerhalb derer sich z.b. in den letzten 24 Std. etwas getan hat, also eine oder mehrere Dateien geändert wurden.
Pit
Da das aber recht viele Ergebnisse sind, würde ich die Ergebnisse gerne dergestalt reduzieren, dass nur noch rekursiv alle "sub2-Verzeichnisse" gefunden und/oder kopiert werden, innerhalb derer sich z.b. in den letzten 24 Std. etwas getan hat, also eine oder mehrere Dateien geändert wurden.
Auch ich glaube, Du willst in Wirklichkeit rsync
. Das ist auch flexibler, was der Zeitpunkt den Änderung und des Backups betrifft. Beim Suchen nach Dateien oder Verzeichnissen mit einem festgelegten Änderungszeitraum bekommst Probleme sobald - warum auch immer - ein Backup mal nicht stattfand. rsync kopiert alles was neuer ist. Mein Script kopiert alles, legt dabei aber harte Links zu unveränderten Dateien an. So bekomme ich hier 30 Voll-Backups "auf dem Speicherplatz von knapp anderthalb".
Hallo Jörg,
Auch ich glaube, Du willst in Wirklichkeit
rsync
.
Ja, Du hast vermutlich recht. Im Zusammenspiel mit find
arbeitet rsync prima.
Pit
Hallo Pit,
speichere mir (inkl. Pfad) den Inhalt im Verzeichnis (ausgehend vom Root) verz1/alleSub2.
Natürlich dann mit Pfadangaben, damit man sie im Falle des Falles wieder zuordnen kann.
Gut, dass Du das im anderen Beitrag geschrieben hast. Meine erste Vermutung war, dass Du alle Dateien aus den sub2-Ordnern zusammenschmeißen wolltest.
Wilde Hypothese: Was passiert denn, wenn Du
rsync -azv myRoot/*/sub2 zielordner
ausführst?
Rolf
Hallo Rolf,
Wilde Hypothese: Was passiert denn, wenn Du
rsync -azv myRoot/*/sub2 zielordner
ausführst?
Habe ich jetzt nicht versucht, sollte aber gehen. Ist aber auch nicht ganz das, was ich bräuchte.
Ich habe mir hier mal etwas zusammen gebastelt, was ganz gut erledigt, was ich haben wollte.
Pit
Hallo Rolf,
Wilde Hypothese: Was passiert denn, wenn Du
rsync -azv myRoot/*/sub2 zielordner
ausführst?
Ich habs mal ausprobiert, aber der Befehl scheint so keinen Sinn zu machen. Denn er speichert nur einen sub2-ordner, vermutlich überschreibt er sich selber und der letzte bleibt dann gespeichert.
Anders sieht es mit rsync -azv --relative myRoot/*/sub2 zielordner
aus, da werden die Pfade mitgespeichert. Aber es wird nur 1 Ebene tief gesucht, was mir z.b. nicht ausreicht.
Anders sieht es mit find . -name sub2 ! -path "./my_exclude/*" -exec rsync -azv --relative {} zielordner
aus, da wird über mehrere Ebenen tief nach dem sub2-ordner gesucht.
Pit
Noch eine Frage: Gibt es irgendeinen Befehl, mit dem ich (zuvor) alle "sub2", die ich beim synchronisieren ausgelassen habe, mitsamt ihrer Verzeichnisstruktur (nur eben ohne die Dateien in den Verzeichnissen - bis auf die Dateien in sub2) in einen anderen Ordner kopieren kann?
Das klingt so langsam nach einem XY Problem. Was möchtest du eigentlich erreichen?
Hi rsync,
Das klingt so langsam nach einem XY Problem. Was möchtest du eigentlich erreichen?
Keine Sorge 😀 Ich verstehe, dass Du das denkst. Meine Frage wäre eigentlich beantwortet gewesen, nachdem der --exclude */sub2 funktioniert.
Ich habe dann aber festgestellt, dass wirklich viele sub2 aussortiert werden. Deshalb dachte ich mir, wäre es eine gute Idee, diese Verzeichnisse irgendwo nochmal gesammelt zusammenzufassen. Natürlich dann mit Pfadangaben, damit man sie im Falle des Falles wieder zuordnen kann.
Hintergrund ist, dass in den sub2 Daten stehen, die ich nicht in der Sicherung haben will, die ich aber ggf. gesammelt woandershin sichern möchte. Sollte ich die Daten auch verschlüsselt per rsync spiegeln können, wäre auch das eine Lösung.
Pit