Risposte:
Se vuoi davvero decomprimerli in parallelo, potresti farlo
for i in *zip; do unzip "$i" & done
Ciò, tuttavia, avvierà N processi per file N .zip e potrebbe essere molto pesante per il tuo sistema. Per un approccio più controllato, lanciando solo 10 processi paralleli alla volta, prova questo:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Per controllare il numero di processi paralleli avviati, -P
passa a quello che desideri. Se non si desidera ricorrere in sottodirectory, fare invece questo:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
In alternativa, è possibile installare GNU parallelo come suggerito da @OleTange nei commenti ed eseguire
parallel unzip ::: *zip
-exec
o -execdir
anziché eseguire il piping a xargs
. Non solo è più semplice da capire, ma è anche meno soggetto a errori e utilizza meno risorse di sistema. find . -name '*.zip' -exec unzip {} ';'
(Devi citare il punto e virgola.)
-exec \;
(puoi sfuggire al punto e virgola, senza bisogno di virgolette), eseguirà ogni comando in sequenza. -exec +
è meglio ma non funzionerà qui poiché non è così che unzip
funziona.
Il comando parallelo GNU si adatta perfettamente a questo tipo di cose. Dopo:
$ sudo apt-get install parallel
Poi
ls *.zip | parallel unzip
Questo utilizzerà tutti i core che hai, mantenendo ogni core occupato con una decompressione, fino a quando non sono stati completati.
echo *.zip
invece per impedire a un possibile alias di intrufolarsi in ulteriori informazioni. Tuttavia, questo ha lo stesso problema della risposta di @ Guru, si interrompe sui nomi dei file contenenti spazi bianchi.
xargs
GNU Parallel non si interrompe sui nomi dei file contenenti spazio / tab / quote. Solo se i nomi dei file contengono newline dovrai prestare particolare attenzione. Ad esempio utilizzando:parallel unzip ::: *.zip
echo
è male come usare ls
. Globbing e un ciclo while è il più sicuro.
Se hai molti .zip
file nella tua cartella e vuoi decomprimerli tutti, apri il terminale e vai alla tua cartella usando:
cd <path_to_folder>
Ora usa questo comando per decomprimere tutto il tuo .zip
file:
ls *.zip | xargs -n1 unzip
echo *.zip
invece per impedire a un possibile ls
alias di intrufolarsi in ulteriori informazioni, tuttavia ciò non risolve ancora il problema degli spazi bianchi.
ls
for script, poiché l'output non è ben definito tra le versioni. Guarda invece la risposta di @terdon in quanto risolve tutti i problemi di questa soluzione.
Puoi usare find con in questo -exec
modo,
find . -name "*.zip" -exec unzip {} \;
Questo sarà funziona se il file ha uno spazio nel nome.
unzip \*.zip
o unzip '*.zip'
L'ovvio unzip *.zip
non funziona, perché la shell lo espande unzip foo.zip bar.zip ...
e unzip
interpreta il primo nome file come file zip e i seguenti nomi file come file da estrarre da quel file zip.
Tuttavia, unzip
è un po 'insolito tra i comandi Unix in quanto esegue le proprie espansioni glob. Se il *
non è espanso dalla shell, decomprimerlo lo farà e interpreterà tutti i nomi di file risultanti come file zip da elaborare. Quindi, in questo caso speciale, si può scappare senza un for
ciclo o xargs
simili.