2011-11-12 13 views
40

Se scelgo un file zip e clicco destro "estrai qui" viene creata una cartella con il nome file zip e viene estratto l'intero contenuto del file zip.crea la cartella per il file zip ed estrai in essa

Tuttavia, mi piacerebbe convertire diversi file zip tramite shell. Ma quando faccio

unzip filename.zip 

la cartella "filename" non viene creata, ma tutti i file vengono estratti nella directory corrente.

Ho esaminato i parametri ma non esiste alcun parametro. Ho anche provato

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done 

ma la .zip estensione del file zip 2. $ e $ 4. zipfile deve essere rimosso con sed. Se faccio

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 

non sta funzionando.

Come sostituire correttamente l'estensione .zip di $zipfile?

C'è un modo più semplice di uno script di shell?

risposta

77

unzip file.zip -d xxx estrarrà i file nella directory xxx e xxx verrà creato se non è lì. È possibile controllare la pagina man per i dettagli.

La linea awk sotto dovrebbe fare il lavoro:

ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh 

Vedi l'prova sotto,

nota che ho rimosso |sh alla fine, dal momento che i miei cerniere sono archivi falsi; Voglio solo mostrare la riga di comando generata qui.

kent$ ls -l 
total 0 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip 

kent$ ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}' 
unzip 001.zip -d 001 
unzip 002.zip -d 002 
unzip 003.zip -d 003 
unzip 004.zip -d 004 
unzip 005.zip -d 005 
unzip 006.zip -d 006 
unzip 007.zip -d 007 
+0

Grazie, funziona come un fascino. – jack

+0

Ma quello che non capisco è perché $ 0 contiene il nome completo del file e $ 1 non l'estensione ".zip"? – jack

+4

@jack Ho definito ".zip" come FS (Field Separator). Quindi 001.zip verrà separato in due parti "001" e "". $ 1 è il primo campo. e $ 0 è l'intera riga che in questo caso è "001.zip" in awk, il campo è contato da 1, non 0. – Kent

31

"Estrai qui" è semplicemente una caratteristica di qualsiasi unzip involucro che si sta utilizzando. unzip estrarrà solo ciò che è effettivamente nell'archivio. Probabilmente non esiste un modo più semplice di uno script di shell. Ma sed, awk ecc non sono necessari per questo se si dispone di una shell POSIX-compliant: (. Non deve sfuggire alla * o espansione di percorso non avrà luogo)

for f in *.zip; do unzip -d "${f%*.zip}" "$f"; done 

Essere consapevoli del fatto che se l'archivio ZIP contiene una directory, ad esempio con gli archivi Eclipse (che contengono sempre eclipse/), si otterrebbe in ogni caso con ./eclipse*/eclipse/eclipse.ini. Aggiungi echo prima del unzip per una corsa a secco.

+0

Grazie per le informazioni. – jack

+2

@jack, questa risposta dovrebbe essere la risposta di accettazione. NON USARE l'output 'ls' per niente. 'ls' è uno strumento per osservare in modo interattivo i metadati della directory. Qualsiasi tentativo di analizzare l'output 'ls' con il codice è rotto. I globi sono molto più semplici e corretti: 'per file in * .zip'. Leggi [Parsing ls] (http://mywiki.wooledge.org/ParsingLs) –

6

Se avete p7zip, la versione da riga di comando di 7zip installato, quindi è possibile utilizzare:

7z x '*.zip' -o'*' 
1

aunpack da atool farà questo per impostazione predefinita per tutti i tipi di archivi.

Problemi correlati