entpacke 'tar', ändere aber den Verzeichnisnamen, in den extrahiert werden soll

26
tar -tf filename.tar
folder1/file
folder1/name
[...]

Ich möchte die Datei und den Namen in Ordner 2 extrahieren . Kann das als Einzeiler gemacht werden?

Felipe Alvarez
quelle

Antworten:

35

Verwenden Sie -Cund --strip-components(siehe man tar).

Beispiel:

mkdir FOLDER
# for remote tar file
curl -L ’remote_tar_file' | tar -xz - -C FOLDER --strip-components=1

# for local tar file
tar -xzf FILENAME -C FOLDER --strip-components=1

Erläuterung:

Das -CFlag setzt voraus, dass bereits ein Verzeichnis vorhanden ist, sodass der Inhalt der TAR-Datei darin erweitert werden kann. daher die mkdir FOLDER.

Das --strip-componentsFlag wird verwendet, wenn sich eine TAR-Datei auf natürliche Weise in einen Ordner erweitern würde, beispielsweise in github, in dem sie Beispiele für repo-name-masterOrdner enthält. Natürlich müssten Sie den hier erstellten Ordner der ersten Ebene nicht so --strip-componentseinstellen 1, dass er diesen ersten Ordner automatisch für Sie entfernt. Je größer die Anzahl ist, desto tiefer verschachtelte Ordner werden entfernt.

Marian
quelle
Ich las man tar. Ich habe es nicht bemerkt --strip-components. schön
Felipe Alvarez
1
tar-1.14 benutzt --strip-path, tar-1.14.90 + benutzt --strip-components. Möglicherweise Problem hier?
Mikhail Moskalev
Ich würde dem zustimmen, wenn es ein Beispiel gäbe und nicht nur die Schalter, wie im Online-Handbuch angegeben , 3 Argumentstile, die Verwirrung stiften .
Iain
Habe das -f auf tar -xz vergessen, denkt ich. Für mich gescheitert. Ich dachte, ich hätte das die ganze Zeit ohne Grund benutzt ...
John Carrell
17

Sie können auch die --transformOption für ein bisschen mehr Flexibilität verwenden. Es akzeptiert alle Sed-Ersatzoperationen.

So extrahiere ich beispielsweise einen Linux-Tarball in ein neues Verzeichnis, damit ich einen Patch anwenden kann:

tar -xjf linux-2.6.38.tar.bz2 --transform 's/linux-2.6.38/linux-2.6.38.1/'
Tom
quelle