Simone: Tar mit Regex

Hi,

habe ein kleines Problem wo ich nicht weiterkomme und Eure Hilfe benötige.

  • Vielen Dank schon im Voraus! -

ich haben ein Tar-Archiv welche folgende Struktur aufweist:

mnt/web31333/d0/102/54094410/htdocs/jugendclub.de/./wp-mail.php
mnt/web31333/d0/102/54094410/htdocs/jugendclub.de/./wp-settings.php
mnt/web31333/d0/102/54094410/htdocs/jugendclub.de/./wp-signup.php
mnt/web31333/d0/102/54094410/htdocs/jugendclub.de/./wp-trackback.php

Ich möchte dieses Tar-Archiv ohne strip-components in das Verzeichnis "/var/www/html/jugendclub.de/dist/" entpacken.

Hier der Befehl mit --strip-components 7

tar xvf /var/www/html/jugendclub.de/dist/sicher/1587120773_web-jugendclub.de.tar.gz --strip-components 7 -C /var/www/html/jugendclub.de/dist/

Mir fehlt der Regex welcher den vorderen Teil abschneidet

mnt/web31333/d0/102/54094410/htdocs/jugendclub.de/./wp-trackback.php

Beim Auspacken soll natürlich das neue Verzeichnis übernommen werden

Also hier entpacken:

/var/www/html/jugendclub.de/dist/wp-trackback.php

tar xvf /var/www/html/jugendclub.de/dist/sicher/1587120773_web-jugendclub.de.tar.gz REGEX /var/www/html/jugendclub.de/dist/

Beste Grüße

Simone

  1. Aus man tar:

    --transform=EXPRESSION, --xform=EXPRESSION
      Use sed replace EXPRESSION to transform file names.
    

    ich habe eine datei laptops.tar mit:

    ~> tar -t -f laptops.tar
    Downloads/Laptops/T500/
    Downloads/Laptops/T500/css821mst.pdf
    Downloads/Laptops/T530/
    Downloads/Laptops/T530/ac_dg_201403_de.pdf
    (gekürzt)
    
    

    Demnach:

    tar -x --transform='flags=r;s|Downloads/Laptops/||' -f laptops.tar
    

    [Y] gestestet, funktioniert

    Erläuterung:

    Die Pipe-Symbole | habe ich als Regex-Trenner zwischen /was/wodurch/wie genommen, weil die in Dateinamen eher selten sind und das die Notation einfacher macht. Bitte denke daran, dass Du eine ganze Reihe von Symbolen maskieren musst.

    1. Hey, Klasse!

      Ich habe versucht mich etwas rein zudenken.

      --transform='flags=r;s|Downloads/Laptops/||'

      Macht das Gleiche wie

      echo "Downloads/Laptops/T530/ac_dg_201403_de.pdf" | sed -r 's|Downloads/Laptops/||'

      korrekt ?

      also brauche ich Splitt Muster für /./

      mnt/web31333/d0/102/54094410/htdocs/jugendclub.de[/./]wp-mail.php

      Grüße Simone

      1. Du willst alles vor dem /./ und dieses /./ selbst mit abschneiden? Dann ist das doch einfach:

        tar -t --transform='flags=s|^/\./||' --show-transformed -v -z -f dein.tar.gz
        

        Das flag „r“ kannst Du wohl weglassen, wenn Dir die Ausgaben gefallen kannst Du durch den Ersatz von -t durch -x „scharf stellen“.

        Nicht wundern, wenn die alten Ordner trotzdem erzeugt werden - das passiert bei mir auch, die bleiben aber leer. Je nachdem, ob der so im aktuellen Ordner entstehende Unterordner mnt/ weg kann, hilft ein nachfolgendes rm -r mnt.

        1. tar -t --transform='flags=s|^.*/\./||' --show-transformed -v -z -f dein.tar.gz
          

          natürlich… Es soll ja eine beliebige Anzahl beliebiger Zeichen (.*) am Beginn des Strings (^) und das /./ (/\./) „gekillt“ werden.

          1. tar -t --transform='flags=s|^.*/\./||' --show-transformed -v -z -f dein.tar.gz
            

            natürlich… Es soll ja eine beliebige Anzahl beliebiger Zeichen (.*) am Beginn des Strings (^) und das /./ (/\./) „gekillt“ werden.

            “Some people, when confronted with a problem, think ‘I know, I’ll use regular expressions.’ Now they have two problems.”

            1. „…Now they have two problems.”

              Reicht hier nicht ganz. Ich hätte das wohl „stumpf“ mit

              olddir=$(pwd);
              tmpdir=$(mktemp -d);
              cd "$tmpdir";
              tar -xz -- "/woher/auch/immer/file.tar.gz"
              find -type f -exec mv "{}" "/wohin/es/soll/" \;;
              cd "$olddir";
              rm -rf "$tmpdir";
              

              gescriptet. Sind aber auch 7 „Probleme“.

          2. Hi,

            das muss ich gleich mal durchlaufen lassen

            echo "mnt/web31333/d0/102/54094410/htdocs/jugendclub.de/./wp-mail.php" | sed -r 's|^.*/./||'

            wp-mail.php

            Klasse Leute Hier ... vielen Dank!

            Simone

            1. Na dann. Freut mich geholfen zu haben.

        2. Vielen, vielen Dank!

          und hier für die Nachwelt:

          TAR mit REGEX

          • der Root-Ausgangs-Path wird eliminiert (egal wo die Seite liegt bzw. gesichert wird)
          • Bei der Sicherung wird ein Punkt verwendet
          • mit dem Punkt werden auch .htaccess usw. gesichert
          • Rechte müssen angepasst werden (ToDo)
          • Es bleiben Fragmente des Stammverzeichnis (Sicherungsserver) übrig welche gelöscht werden müssen (ToDo)

          Sichern des Webverzeichnis:

          root@OFF-SERVER:# tar -zcvpf /var/www/html/jugendclub.de/dist/sicher/1587131934_web-jugendclub.de.tar.gz --exclude='./sicher' /var/www/html/jugendclub.de/dist/.

          Wiederherstellen:

          root@OFF-SERVER:# tar --transform='s|^.*/./||' --show-transformed -v -x -f /var/www/html/jugendclub.de/dist/sicher/deinetar.tar.gz -C /var/www/html/jugendclub.de/dist/

          Grüße Simone

          1. Rechte müssen angepasst werden (ToDo)

            Aus dem Grund bin gerne geneigt, bei Backups mit

            getfacl -R . > acl.list
            

            eine Liste mit den Eigentümern, Gruppen und Rechten zu erzeugen, die man mit

            setfacl --restore  acl.list
            

            nutzen kann. Die acl.list ist menschen- und machinenlesbar, kann mit den üblichen Linux-Werkzeugen wie sed, tr, awk ... bearbeitet werden.

            Falls (noch) nicht installiert: Das Paket heißt „acl“.

            1. getfacl -R . > acl.list
              

              Da es in dem Fall oft unklug ist, symbolischen Links zu folgen:

              getfacl -R -P . > acl.list
              
  2. @Simone

    Es gibt da was, was mir keine Ruhe gelassen hat:

    tar xvf /var/www/html/jugendclub.de/dist/sicher/1587120773_web-jugendclub.de.tar.gz
    

    Hm. Die Zahl sieht für Hackixe wie meinereinen selbst nach einer Unixtime aus. Sowas seh ich also so nach:

    date --date='@1587120773';
    Fr 17. Apr 12:52:53 CEST 2020
    

    Jepp. Sieht ziemlich echt aus, sind wahrscheinlich keine Beipieldaten.

    Da diese Datei „1587120773_web-jugendclub.de.tar.gz“ sehr wahrscheinlich auch Passwörter (z.B. für den Datenbankzugang) enthält solltest Du dafür Sorge tragen, dass diese NICHT von Dritten, z.B. via

    http://jugendclub.de/dist/sicher/1587120773_web-jugendclub.de.tar.gz

    abrufbar ist (bzw. wird, denn gegenwärtig bekommt man da 404er, aber Du hast scheinbar vor, jugendclub.de von Strato auf einen anderen, wahrscheinlich selbst verwalteten virtuellen Server umzuziehen - oder?).

    Zudem solltest Du künftig darauf achten, keine echten Pfadangaben in Foren und dergleichen zu veröffentlichen.

    1. Hm,

      jugendclub.de ist ein schöner Domain-Name!

      aber ich habe keinen Zugriff darauf ;o) also nur ein Beispiel...

      Grüße Simone

      1. Moin,

        jugendclub.de ist ein schöner Domain-Name!

        ja, und er ist tatsächlich vergeben, "gehört" also jemandem.

        aber ich habe keinen Zugriff darauf ;o) also nur ein Beispiel...

        Fremde Domainnamen für Beispiele zu verwenden, ist aber nicht gerade die feine Art. Unter Umständen sind die Inhaber darüber gar nicht begeistert.

        Für neutrale Beispiele gibt es extra dafür vorgesehene Platzhalter-Domains wie example.net oder example.org (aber nicht example.de).

        Live long and pros healthy,
         Martin

        --
        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
        1. Hi,

          Fremde Domainnamen für Beispiele zu verwenden, ist aber nicht gerade die feine Art. Unter Umständen sind die Inhaber darüber gar nicht begeistert.

          Ja, dem kann ich nur zustimmen! Zum Glück ist es nur eine "Verzeichnisbezeichnung" innerhalb einer Linux-Funktion ;o)

          Nein, habe versucht meinen Betrag zu überarbeiten ... offenbar fehlen mir die Berechtigungen.

          Beste Grüße Simone

      2. Dann scheint ja alles gut.

        Um die falsch-positive Alarmierung durch überempfindliche Burschen wie mich zu vermeiden hat es sich eingebürgert, statt echten und gar fremden Host bzw. Domainnamen „example.com“ das berühmte Elternbar Max und Maria Mustermann sowie der Kinderschar [foo, bar, baz, tok, ...] zu bemühen.