So extrahieren Sie bestimmte Dateien aus tar.gz

105

Wie können wir bestimmte Dateien aus einer großen tar.gz-Datei extrahieren? In dieser Frage habe ich den Vorgang zum Extrahieren von Dateien aus einem Teer gefunden, aber als ich dort den genannten Befehl ausprobierte, kam der Fehler:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Wie extrahiere ich dann eine Datei aus tar.gz?

Ankit Vashistha
quelle
Beachten Sie, dass jede Lösung zuerst das gesamte Archiv dekomprimieren muss: superuser.com/questions/655739/… Wenn Sie dies vermeiden möchten, müssen Sie ein anderes Format verwenden, z. B. zip. ZIP wird jedoch weniger komprimiert, da es einzelne Dateien separat komprimiert: superuser.com/questions/1013309/… Ich frage mich, ob es ein Format gibt, das sowohl Geschwindigkeit als auch die Fähigkeit zum Extrahieren einer einzelnen Datei unterstützt.
Ciro Santilli

Antworten:

119

Sie können auch verwenden tar -zxvf <tar filename> <file you want to extract>

Sie müssen den Dateinamen genau so schreiben, wie tar ztf test.tar.gzes angezeigt wird. Wenn dort zB ./extract11oder some/bunch/of/dirs/extract11steht, müssen Sie dies angeben (und die Datei wird genau unter diesem Namen angezeigt, die benötigten Verzeichnisse werden automatisch erstellt).

  • -x: weist tar an, Dateien zu extrahieren.
  • -f: Gibt den Dateinamen / Tarballnamen an.
  • -v: Ausführlich (Fortschritt beim Extrahieren von Dateien anzeigen).
  • -z: Archiv über gzip filtern, zum Dekomprimieren von .gz-Dateien verwenden.
harish.venkat
quelle
$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha
1
dann probiere diese tar tf archive.tar.gz | grep extract11.bitte prüfe ob extract11 im archiv ist oder nicht
harish.venkat 16.01.13
8
Sie müssen den Dateinamen genau so schreiben, wie tar ztf test.tar.gzes angezeigt wird. Wenn dort zB ./extract11oder some/bunch/of/dirs/extract11steht, müssen Sie dies angeben (und die Datei wird genau unter diesem Namen angezeigt, die benötigten Verzeichnisse werden automatisch erstellt).
Vonbrand
Ich möchte hier einen Punkt hinzufügen, die -zOption funktioniert in einigen Unix-Versionen wie HP-UX nicht.
Ankit Vashistha
1
@ pj-brunet: Nein, fmuss nicht am Ende sein. Es muss aber direkt der Dateiname folgen. In diesem Beispiel wird mit allen anderen Optionen , die nach dem Teer Namen funktioniert: tar -f mytar.tar.gz -zxv dir/somefile. Es extrahiert "dir / somefile" aus "mytar.tar.gz".
13.
34

Angenommen, Sie haben einen Tarball mit dem Namen lotsofdata.tar.gzund wissen, dass eine Datei vorhanden ist, die Sie verwenden möchten. Sie können sich jedoch nur daran erinnern, dass der Name das Wort enthält contract. Sie haben zwei Möglichkeiten:

Verwenden Sie entweder tarund, grepum den Inhalt Ihres Tarballs aufzulisten, damit Sie den vollständigen Pfad und Namen aller Dateien herausfinden können, die mit dem Teil übereinstimmen, das Sie kennen, und tarextrahieren Sie dann die eine Datei, wenn Sie die genauen Details kennen, oder verwenden Sie zwei Mit den wenig bekannten Schaltern können Sie einfach alle Dateien extrahieren, die mit dem Wenig übereinstimmen, das Sie über Ihren Dateinamen wissen. Für diese Option müssen Sie weder den vollständigen Namen noch einen Teil des Pfads kennen. Die Details sind:

Option 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Dies listet die Details aller Dateien auf, deren Namen Ihren bekannten Teil enthalten. Dann extrahieren Sie was Sie wollen mit:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Möglicherweise müssen Sie ./vor Ihrem Pfad, damit es funktioniert.

Option 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Bis zu Ihnen, die Sie leichter oder am nützlichsten finden.

Wendy Cricks
quelle
Drat. Ein Tippfehler bei diesem letzten Befehl: Ich habe -xzf dupliziert. Es sollte nur eine Instanz dieser Schalter geben.
Wendy Cricks
tar -xzf lotsofdata.tar.gz <full path and filename from your list above>arbeitete für mich, ohne ./zu Beginn des vollständigen Pfades zu geben
user13107
Sie müssen möglicherweise etwas Geduld mit diesen haben, es hat eine Weile gedauert ... Es ist auch offensichtlich, aber es wird die vollständige Verzeichnisstruktur im aktuellen Verzeichnis extrahieren, auch wenn diese Verzeichnisse noch nicht existieren.
PJ Brunet
BSD tar (zumindest unter macOS) unterstützt diese --wildcardsOption nicht. Ich konnte mich immer noch ähnlich verhalten -x -O *foo. *foowar in meinem Fall der Dateiname glob, da ich wusste, dass die Datei mit foo endet.
Eric Hu
6

Ich habe neulich versucht, ein paar hundert Dateien aus einem Archiv mit Tausenden von Dateien zu extrahieren. Auf die von mir benötigten Dateien kann nicht mit einem einzigen Platzhalter verwiesen werden. Also habe ich gegoogelt und diese Seite gefunden.

Keiner der oben genannten Tricks scheint jedoch für meine Aufgabe gut zu sein. Am Ende las ich den Mann und fand diese Option --files-from. Meine endgültige Lösung ist also

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

und es funktioniert wie ein Zauber.

Update: Die Listendatei sollte dasselbe Format haben, das Sie von sehen würden tar -tvf, sonst könnten Sie keine Dateien extrahieren.

JJ Tang
quelle
2

Ihr Beispiel funktioniert für mich, wenn Sie die Klammern weglassen

$ tar --extract --file=test.tar.gz extract11

Wenn sich Ihre Datei extract11 in einem Unterordner befindet, sollten Sie den Pfad innerhalb des Tarballs angeben.

$ tar --extract --file=test.tar.gz subfolder/extract11
Bernhard
quelle
$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha
Dann ist offensichtlich extract11 nicht in der tar-Datei. Stellen Sie sicher, dass Sie den relativen Pfad angeben müssen. Siehe Bearbeiten
Bernhard
1

Nachfolgend finden Sie Beispiele zum Extrahieren bestimmter Dateien aus der Datei tar.gz.

Aus lokaler Datei:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Von entfernter URL:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
Kenorb
quelle