Estrai solo un file specifico da un archivio zippato in una determinata directory


151

Devo estrarre un singolo file da un file ZIP a cui conosco il percorso. Esiste un comando come il seguente:

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

Sfortunatamente, il comando precedente estrae e ricrea l'intero percorso del file in ./path/to/zipped/file.txt. C'è un modo per estrarre semplicemente il file in una directory specificata?

Risposte:


130

È possibile estrarre solo il testo nell'output standard con l' -popzione:

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

Questo non estrarrà i metadati (data, autorizzazioni, ...), solo il contenuto del file. Questo è il prezzo da pagare per la comodità di non dover spostare il file in seguito.

In alternativa, monta l'archivio come directory e copia il file. Con AVFS :

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

O con fusibile-zip :

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

2
@TK Kocheran: Perché non lo provi e basta? Ho testato il primo comando e ha funzionato.
utente sconosciuto

1
@TKKocheran: I file Jar sono zip, quindi i metodi di decompressione e zip-fusibile funzioneranno ovviamente. Anche il metodo AVFS funziona, perché AVFS indovina il formato in base ai nomi dei file e lo conosce .jar; se il tuo file ha un nome diverso, potresti dover dire ad AVFS di usare il suo gestore zip, ad es ~/.avfs$PWD/foo.apk#uzip/META-INF.
Gilles,

1
in realtà, intendevo estrarre un file JAR / binario da un archivio ZIP. Non ho ancora avuto la possibilità di provarlo, vedi qualche problema usando il primo comando sopra per estrarre i file binari?
Naftuli Kay,

2
@TKKocheran: non ci sono problemi, -pestrae il file così com'è ( -cfa la conversione del testo).
Gilles,

2
Penso che la risposta di @Myles sia più elegante, perché non richiede il reindirizzamento dell'output e conserva gli attributi del file.
gertvdijk,

152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Inserisci il percorso completo per il file zippato, non solo il nome file. Assicurati di mantenere la struttura vista dal file zip.

Ciò estrarre il singolo file file.txtin myarchive.zipa /path/to/unzip/to/file.txt.


18
Questa è la risposta migliore
Redburn,

1
Non gestisce il caso in cui si desidera che il nome file generato sia diverso.
Oleg Vaskevich,

6
il parametro "-j": percorsi spazzatura. La struttura delle directory dell'archivio non viene ricreata; tutti i file vengono depositati nella directory di estrazione (per impostazione predefinita, quella corrente). il parametro "-d": estrae i file in exdir
e1i45

1
@OlegVaskevich, la domanda non richiede che il nome file di destinazione sia diverso
Tapemaster

Si lo so. Ancora votato. :)
Oleg Vaskevich,

25

Versione più semplice:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Questo verrà ricreato PATH_OF_FILE_INSIDE_ARCHIVEnella directory corrente ma estrae solo il file specificato.

Per elencare tutti i file in un archivio Zip:

unzip -l ARCHIVE_NAME

2
Molto più semplice della risposta accettata.
FractalSpace

In effetti, ha funzionato bene ed è waaaay più semplice
Mahmoud Ali

2

Su macOS , che per impostazione predefinita utilizza Info-Zip

Prima elenca i file per trovare quello che vuoi

unzip -l my.zip

Quindi fornire un elenco di file da estrarre dall'archivio

unzip my.zip annoying/path/to/file

Combina con -p per stdout

unzip -p my.zip annoying/path/to/file >./file

1
Non capisco perché le persone effettuano il downgrade senza alcuna ragione ovvia. Questa è una risposta corretta (non solo per macOS)
FractalSpace

@FractalSpace Non è evidentemente, fa l'opposto di ciò che OP vuole.
Konrad Rudolph,

La chiave sta ottenendo un singolo file. L'output su stdout e il reindirizzamento usando il flag -p è banale, ma l'ho aggiunto esplicitamente
Cameron Lowell Palmer

2

uso semplice:

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

e gonfia il file.

$ 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

Può anche aggiungere l' -d outpathargomento per specificare dove viene inserito il file.
Efren,

E l' -jargomento per evitare i percorsi compressi
Efren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.