Extrahieren Sie nur eine bestimmte Datei aus einem komprimierten Archiv in ein bestimmtes Verzeichnis

151

Ich muss eine einzelne Datei aus einer ZIP-Datei extrahieren, deren Pfad ich kenne. Gibt es einen Befehl wie den folgenden:

unzip -d . myarchive.zip path/to/zipped/file.txt

Leider extrahiert und erstellt der obige Befehl den gesamten Pfad zur Datei unter ./path/to/zipped/file.txt. Kann ich die Datei einfach in ein bestimmtes Verzeichnis ziehen?

Naftuli Kay
quelle

Antworten:

130

Sie können mit der -pOption nur den Text in die Standardausgabe extrahieren :

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

Dadurch werden nicht die Metadaten (Datum, Berechtigungen, ...), sondern nur der Dateiinhalt extrahiert. Dies ist der Preis, den Sie zahlen müssen, um die Datei anschließend nicht verschieben zu müssen.

Alternativ können Sie das Archiv als Verzeichnis bereitstellen und die Datei einfach kopieren. Mit AVFS :

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

Oder mit Sicherungsreißverschluss :

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d
Gilles
quelle
2
@TK Kocheran: Warum testest du es nicht einfach? Ich habe das erste Kommando getestet und es hat funktioniert.
Benutzer unbekannt
1
@TKKocheran: Jar-Dateien sind Reißverschlüsse, daher funktionieren die Methoden unzip und fuse-zip offensichtlich. Die AVFS-Methode funktioniert auch, da AVFS das Format basierend auf den Dateinamen errät und sich damit auskennt .jar. Wenn Ihre Datei einen anderen Namen hat, müssen Sie AVFS möglicherweise anweisen, den Zip-Handler zu verwenden, z ~/.avfs$PWD/foo.apk#uzip/META-INF.
Gilles
1
Eigentlich wollte ich eine JAR- / Binärdatei aus einem ZIP-Archiv extrahieren. Ich hatte noch keine Gelegenheit, es zu testen. Können Sie Probleme beim Extrahieren von Binärdateien mit dem ersten Befehl oben feststellen?
Naftuli Kay
2
@TKKocheran: Es gibt kein Problem, -pdie Datei wird wie sie ist extrahiert ( -cführt eine Textkonvertierung durch).
Gilles
2
Ich denke, die Antwort von @Myles ist eleganter, da keine Umleitung der Ausgabe erforderlich ist und die Dateiattribute erhalten bleiben.
gertvdijk
152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Geben Sie den vollständigen Pfad für die komprimierte Datei ein, nicht nur den Dateinamen. Stellen Sie sicher, dass die Struktur in der ZIP-Datei so bleibt, wie sie angezeigt wird.

Dadurch wird die einzelne Datei extrahieren file.txtin myarchive.zipzu /path/to/unzip/to/file.txt.

sMyles
quelle
18
Das ist die bessere Antwort.
Redburn
1
Der Fall, dass der generierte Dateiname anders sein soll, wird nicht behandelt.
Oleg Vaskevich
6
Der Parameter "-j": Junk-Pfade. Die Verzeichnisstruktur des Archivs wird nicht neu erstellt. Alle Dateien werden im Extraktionsverzeichnis abgelegt (standardmäßig das aktuelle). der Parameter "-d": extrahiere Dateien in exdir
e1i45
1
@OlegVaskevich, die Frage fordert nicht an, dass der Zieldateiname unterschiedlich ist
Tapemaster
Ja ich weiß. Immer noch positiv bewertet. :)
Oleg Vaskevich
25

Einfachere Version:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Dies wird PATH_OF_FILE_INSIDE_ARCHIVEim aktuellen Verzeichnis neu erstellt, aber nur die angegebene Datei extrahiert.

So listen Sie alle Dateien in einem Zip-Archiv auf:

unzip -l ARCHIVE_NAME
Taukir
quelle
2
Viel einfacher als die akzeptierte Antwort.
FractalSpace
In der Tat hat gut funktioniert und es ist waaaay einfacher
Mahmoud Ali
2

Unter macOS , das standardmäßig Info-Zip verwendet

Listen Sie zuerst die Dateien auf, um das Gewünschte zu finden

unzip -l my.zip

Stellen Sie dann eine Liste der Dateien bereit, die aus dem Archiv extrahiert werden sollen

unzip my.zip annoying/path/to/file

Kombinieren Sie mit -p für stdout

unzip -p my.zip annoying/path/to/file >./file
Cameron Lowell Palmer
quelle
1
Ich verstehe nicht, warum Leute ohne ersichtlichen Grund abstimmen. Dies ist eine korrekte Antwort (nicht nur für MacOS)
FractalSpace
@FractalSpace Es ist offensichtlich nicht, es macht das Gegenteil von dem, was OP will.
Konrad Rudolph
Der Schlüssel erhält eine einzelne Datei. Die Ausgabe auf stdout und die Umleitung mit dem Flag -p ist trivial, aber ich habe es ausdrücklich hinzugefügt
Cameron Lowell Palmer,
2

einfache Bedienung:

unzip zipfile.zip path/inside/zip/file.txt

und es wird die Datei aufblasen.

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php
Cesar Alejandro Bravo Anaya
quelle
Kann auch das Hinzufügen -d outpathArgument angeben , wo sich die Datei in gesetzt wird.
Efren
Und das -jArgument, um die komprimierten Pfade zu vermeiden
Efren