Pit: Frage zu --exclude bei rsync

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

  1. Hallo Pit,

    RTFM

    Sollte also funktionieren, aber die --exclude Option muss vor der Angabe der Quelle stehen.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Pit,

      RTFM

      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

      1. 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

        --
        sumpsi - posui - clusi
        1. 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

          1. 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

            1. 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

              1. 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

                1. 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

                  1. 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.

                    1. 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

                      1. 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".

                        1. Hallo Jörg,

                          Auch ich glaube, Du willst in Wirklichkeit rsync.

                          Ja, Du hast vermutlich recht. Im Zusammenspiel mit find arbeitet rsync prima.

                          Pit

          2. 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

            --
            sumpsi - posui - clusi
            1. 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

            2. 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

      2. 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?

        1. 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