Decomprimi tutti i file in una directory


203

Ho una directory di file ZIP (creati su un computer Windows). Posso decomprimerli manualmente usando unzip filename, ma come posso decomprimere tutti i file ZIP nella cartella corrente tramite la shell?

Utilizzando Ubuntu Linux Server.

Risposte:


395

Funziona in bash, secondo questo link :

decomprimere \ *. zip


2
Avevo bisogno della barra rovesciata con Zsh . Non so per quale motivo ne avresti bisogno se usi Bash.
Don McCurdy,

Cosa succederà con i file duplicati? Immagino che avrà la precedenza?
kerner1000,

Funziona alla grande su macOS 😀
Ahi Tuna

1
In questo modo ottengo il nome file non corrispondente per tutti i file zip nella directory
thebeancounter,

1
La versione con virgolette ha funzionato per me su WSL. Anche i nomi dei file contenevano spazi, FWIW.
Max Candocia,

107

Basta inserire alcune virgolette per sfuggire al jolly:

unzip "*.zip"

2
+1 Questo ha funzionato per me. Ho dovuto decomprimere i nomi dei file con un formato particolare limitando il resto. Ho solo mantenuto il formato corrispondente tra virgolette doppie e ha funzionato come un fascino. L'output mi dice il numero di archivi elaborati con successo.
Lalit Kumar B,

Ha funzionato magnificamente sul sottosistema Ubuntu per Windows, 18/11/2018. La risposta migliore non ha funzionato.
julianstanley,

64

Il seguente script bash estrae tutti i file zip nella directory corrente in nuove directory con il nome file del file zip, ovvero:

I seguenti file:

myfile1.zip
myfile2.zip 

Verrà estratto a:

./myfile1/files...
./myfile2/files...

Script di shell:

#!/bin/sh
for zip in *.zip
do
  dirname=`echo $zip | sed 's/\.zip$//'`
  if mkdir "$dirname"
  then
    if cd "$dirname"
    then
      unzip ../"$zip"
      cd ..
      # rm -f $zip # Uncomment to delete the original zip file
    else
      echo "Could not unpack $zip - cd failed"
    fi
  else
    echo "Could not unpack $zip - mkdir failed"
  fi
done

4
Questa è la cosa per conquistare tutte le cose. Non posso credere che non sia stato votato più in alto
billynoah,

Questo non riguarda gli spazi nei nomi dei file.
David Oliver,

1
Aggiungi solo virgolette "al nome del file
CONvid19,

1
il `mi ha salvato la giornata! Grazie! Sto facendo un ciclo, decomprimere, eseguire un'azione, copiare, grep qualcosa, rimuovere. Ciò che mancava era come passare da file.gz a file come variabile nello script bash
thahgr

38

decomprimere * .zip, o se si trovano in sottocartelle, quindi qualcosa del genere

find . -name "*.zip" -exec unzip {} \;

unzip esegue l'elaborazione con caratteri jolly, quindi un file chiamato "* .zip" non farà ciò che ti aspetti.
geocar

3
In realtà questo farà esattamente ciò che è previsto, il risultato dell'operazione di ricerca è stato passato per decomprimerlo
John Bargman

1
Questo estrarrà tutti i file zip nella directory corrente, cosa succede se voglio che i file zip (presenti nelle sottocartelle) vengano estratti nelle rispettive sottocartelle?
Rishabh Agrahari,

2
@RishabhAgrahari Ho indirizzato il tuo commento in una nuova risposta .
jojo,

per i gzip'edfile, utilizzare gunzip -rfk .per
decomprimere

17

Decomprimi tutti i .zipfile e archivia il contenuto in una nuova cartella con lo stesso nome e nella stessa cartella del .zipfile:

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Questa è un'estensione della risposta di @ phatmanace e indirizza il commento di @ RishabhAgrahari :

Questo estrarrà tutti i file zip nella directory corrente, cosa succede se voglio che i file zip (presenti nelle sottocartelle) vengano estratti nelle rispettive sottocartelle?


1
per i gzip'edfile, utilizzare gunzip -rfk .per
decomprimere

2
Ottenere find: illegal option -- nutilizzando UnZip 6.00 - qualcun altro?
DannyDannyDanny

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Hai dimenticato l'elenco delle directory.
SaundersB

16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Ciò decomprimerà tutti gli archivi zip in nuove cartelle denominate con i nomi dei file degli archivi zip.

a.zip b.zip c.zipverrà decompresso a b crispettivamente nelle cartelle.


6

aunpack -e *.zip, con atoolinstallato. Ha il vantaggio di gestire in modo intelligente gli errori e di decomprimersi sempre nelle sottodirectory a meno che zip non contenga solo un file. Pertanto, non vi è alcun pericolo di inquinare la directory corrente con masse di file, come unzipnel caso di un file zip senza struttura di directory.


6

In qualsiasi shell POSIX, questo verrà decompresso in una directory diversa per ogni file zip:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done

1
O come one-liner:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn,

2

Usa questo:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done

2

for file in 'ls *.zip'; do unzip "${file}" -d "${file:0:-4}"; done


1
Ottimo per me. Decomprimere nelle loro sottocartelle rispettivamente
insign

È più sicuro fare for file in *.zip; do ...bene?
peterflynn,

1

Se i file lo sono gzip'd. Quindi usa solo:

gunzip -rfk .

dalla directory principale per estrarre in modo ricorsivo i file nelle rispettive directory mantenendo quelli originali (o rimuoverli -kper eliminarli)


0

Questa è una variante della risposta di Pedro Lobito usando Come scorrere in modo ricorsivo una directory per eliminare i file con determinati insegnamenti sulle estensioni :

shopt -s globstar
root_directory="."

for zip_file_name in **/*.{zip,sublime\-package}; do
    directory_name=`echo $zip_file_name | sed 's/\.\(zip\|sublime\-package\)$//'`
    printf "Unpacking zip file \`$root_directory/$zip_file_name\`...\n"

    if [ -f "$root_directory/$zip_file_name" ]; then
        mkdir -p "$root_directory/$directory_name"
        unzip -o -q "$root_directory/$zip_file_name" -d "$directory_name"

        # Some files have the executable flag and were not being deleted because of it.
        # chmod -x "$root_directory/$zip_file_name"
        # rm -f "$root_directory/$zip_file_name"
    fi
done

-2
for i in `ls *.zip`; do unzip $i; done

14
Uso pericoloso di ls. E se hai un file chiamato "-j -o -d .. jackass.zip"
geocar


-3

Uso

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

per decomprimere una cartella in linux


Questo decomprimerà solo un singolo file. La domanda è decomprimere tutte le cartelle
Vivek Panday,

Ad essere onesti, il titolo "Decomprimi tutti i file in una directory" potrebbe essere ambiguo e significare anche "Decomprimere un singolo archivio in una directory separata".
Jdersen,
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.