tar - Entfernt die verwerfende Verzeichnisstruktur

34

unziphat eine raffinierte Option -j, bei der die Verzeichnisstruktur des Archivs verworfen wird und alle Dateien in dasselbe Verzeichnis extrahiert werden.

Gibt es eine Möglichkeit, tarauf die gleiche Weise zu arbeiten? Nichts in der Manpage scheint darauf hinzudeuten.

Gibt es also ein alternatives Tool, vorzugsweise Freie Software, das dies ermöglicht?

Benji XVI
quelle

Antworten:

79

GNU Teer lebt von Featuritis, daher hat er natürlich auch einige Optionen dafür.
http://www.gnu.org/software/tar/manual/html_node/transform.html

Wenn Sie nur ein paar Pfadsegmente entfernen möchten, ist --strip-components=noder --strip=nist dies häufig der Fall :

 tar xvzf tgz --strip=1

Es ist aber auch möglich, die zu extrahierenden Dateien neu zu schreiben (Flags sind --transformoder --xformund akzeptieren dies mit dem /xModifikator):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

Für die Auflistung eines Tar benötigen Sie die zusätzliche --show-transformedOption:

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

Ich glaube, die Optionen zum Umschreiben funktionieren auch beim Packen, nicht nur beim Extrahieren. Hat paxaber offensichtlich eine schönere Syntax.

Mario
quelle
4
Warum nicht s#.*/##?
10.
3
--strip hat gerade meinen Tag gemacht. Vielen Dank!
SamStephens
--stripWird in der Manpage zu os x tar nicht erwähnt, funktioniert aber trotzdem, danke!
SLF
3
Weit besser als die akzeptierte Antwort.
Klaatu von Schlacker
Gibt es einen Unterschied zwischen --stripund --strip-components?
Joel Berkeley
13

Das geht ganz einfach in zwei Schritten. Bei Bedarf anpassen:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
MikeyB
quelle
so würde ich es machen ( find -exec mv -ianstatt find | xargs) ... einfache schritte, die ich auf jedem system wiederholen kann, ohne ein script mitnehmen zu müssen, um es für mich zu machen.
Quack Quijote
1
+1, tmpdir=$( mktemp -d )ist praktisch beim Erstellen von temporären Verzeichnissen
sorki
8

pax kann es tun:

pax -v -r -s '/.*\///p' < archive.tar

oder

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

Sie können den Vorgang zum Ersetzen von Namen zuerst überprüfen, indem Sie die -rOption weglassen .

hfs
quelle
1

Eine mögliche Lösung, die keine Installation erfordert.

  1. Verwenden Sie a tar tvf, um alle Dateien aus dem Tarball zu holen
  2. Extrahieren Sie diese Dateien einzeln - lassen Sie tar nach stdout extrahieren und auf $ filename umleiten

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

als extract.sh speichern und ausführen als extract.sh myfile.tar. Es werden auch alle doppelten Dateinamen überschrieben, die in den vom Tarball abgerufenen Verzeichnissen gefunden wurden.

DaveParillo
quelle
Eigentlich habe ich es gerade in einem Verzeichnisbaum zu Hause getestet und es schlägt bei Dateien mit Leerzeichen fehl. Ich werde sehen, ob ich kein Update posten kann.
DaveParillo 18.11.09
Es wurde behoben, aber es ist bei weitem nicht so hübsch wie es war.
DaveParillo
-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

Die -OOption extrahiert eine Datei, um sie zu standardisieren, und >leitet diese Ausgabe in eine Datei um. In meinem Beispiel extrahiere ich foo.mp3 und leite es in bar.mp3 um. Die Dateinamen sind beliebig.

Klaatu von Schlacker
quelle