Wyodrębnij tylko określony plik z skompresowanego archiwum do danego katalogu

150

Muszę wyodrębnić pojedynczy plik z pliku ZIP, do którego znam ścieżkę. Czy istnieje takie polecenie:

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

Niestety powyższe polecenie wyodrębnia i odtwarza całą ścieżkę do pliku z ./path/to/zipped/file.txt. Czy istnieje sposób, aby po prostu wyciągnąć plik do określonego katalogu?

Naftuli Kay
źródło

Odpowiedzi:

130

Możesz wyodrębnić tylko tekst na standardowe wyjście z -popcją:

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

Nie spowoduje to wyodrębnienia metadanych (data, uprawnienia,…), a jedynie zawartość pliku. Jest to cena, którą trzeba zapłacić za wygodę, że nie trzeba później przenosić pliku.

Alternatywnie, zamontuj archiwum jako katalog i po prostu skopiuj plik. Z AVFS :

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

Lub z zamkiem bezpiecznikowym :

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
źródło
2
@TK Kocheran: Dlaczego tego nie przetestujesz? Przetestowałem pierwsze polecenie i zadziałało.
użytkownik nieznany
1
@TKKocheran: Pliki jar to zamki błyskawiczne, więc metody rozpakowywania i fuse-zip będą oczywiście działać. Metoda AVFS również działa, ponieważ AVFS zgaduje format na podstawie nazw plików i wie o tym .jar; jeśli twój plik ma inną nazwę, być może będziesz musiał powiedzieć AVFS, aby użył jego obsługi zip, np ~/.avfs$PWD/foo.apk#uzip/META-INF.
Gilles
1
właściwie miałem na myśli wyodrębnienie pliku JAR / binarnego z archiwum ZIP. Nie miałem jeszcze okazji go przetestować. Czy widzisz jakieś problemy z użyciem pierwszego polecenia powyżej do wyodrębnienia plików binarnych?
Naftuli Kay
2
@TKKocheran: Nie ma problemu, wypakowuje plik w obecnej -ppostaci ( -cwykonuje konwersję tekstu).
Gilles
2
Myślę, że odpowiedź @Myles jest bardziej elegancka, ponieważ nie wymaga przekierowania danych wyjściowych i zachowuje atrybuty plików.
gertvdijk
152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Wprowadź pełną ścieżkę do skompresowanego pliku, a nie tylko nazwę pliku. Pamiętaj, aby zachować strukturę widoczną z pliku zip.

To wyodrębnić pojedynczy plik file.txtw myarchive.zipcelu /path/to/unzip/to/file.txt.

sMyles
źródło
18
To lepsza odpowiedź.
redburn
1
Nie obsługuje przypadku, w którym chcesz, aby wygenerowana nazwa pliku była inna.
Oleg Waszkiewicz
6
parametr „-j”: ścieżki śmieci. Struktura katalogów archiwum nie jest odtwarzana; wszystkie pliki są zdeponowane w katalogu wypakowywania (domyślnie bieżącym). parametr „-d”: wypakuj pliki do exdir
e1i45
1
@OlegVaskevich, pytanie nie wymaga, aby docelowa nazwa pliku była inna
Tapemaster
Tak, wiem. Nadal głosowałem. :)
Oleg Waszkiewicz
24

Prostsza wersja:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Spowoduje to ponowne utworzenie PATH_OF_FILE_INSIDE_ARCHIVEw bieżącym katalogu, ale wyodrębni tylko określony plik.

Aby wyświetlić listę wszystkich plików w archiwum Zip:

unzip -l ARCHIVE_NAME
Taukir
źródło
1
Znacznie prostsze niż zaakceptowana odpowiedź.
FractalSpace
Rzeczywiście, działało dobrze i jest o wiele prostsze
Mahmoud Ali
2

Na macOS , który domyślnie używa Info-Zip

Najpierw listę plików, aby znaleźć to, czego chcesz

unzip -l my.zip

Następnie podaj listę plików do wyodrębnienia z archiwum

unzip my.zip annoying/path/to/file

Połącz z -p dla standardowego wyjścia

unzip -p my.zip annoying/path/to/file >./file
Cameron Lowell Palmer
źródło
1
Nie rozumiem, dlaczego ludzie głosują bez wyraźnego powodu. To poprawna odpowiedź (nie tylko dla macOS)
FractalSpace
@FractalSpace Najwyraźniej nie jest, robi to przeciwieństwo tego, czego chce OP.
Konrad Rudolph
Kluczem jest uzyskanie indywidualnego pliku. Dane wyjściowe na standardowe wyjście i przekierowanie za pomocą flagi -p są trywialne, ale dodałem je jawnie
Cameron Lowell Palmer
2

proste użycie:

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

i spowoduje to zawyżenie pliku.

$ 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
źródło
Można również dodać -d outpathargument, aby określić, gdzie plik jest umieszczony.
Efren
I -jargument, aby uniknąć skompresowanych ścieżek
Efren