Respostas:
Se você realmente deseja descompactá-los em paralelo, você pode fazer
for i in *zip; do unzip "$i" & done
Isso, no entanto, iniciará processos N para arquivos N .zip e poderá ser muito pesado em seu sistema. Para uma abordagem mais controlada, iniciando apenas 10 processos paralelos por vez, tente o seguinte:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Para controlar o número de processos paralelos iniciados, mude -P
para o que você quiser. Se você não deseja recursar em subdiretórios, faça o seguinte:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Como alternativa, você pode instalar o GNU paralelo, como sugerido por @OleTange nos comentários e executar
parallel unzip ::: *zip
-exec
ou em -execdir
vez de canalizar para xargs
. Além de ser mais simples de entender, também é menos propenso a erros e utiliza menos recursos do sistema. find . -name '*.zip' -exec unzip {} ';'
(Você deve citar o ponto e vírgula.)
-exec \;
(você pode escapar do ponto-e-vírgula, sem necessidade de aspas), executará cada comando sequencialmente. -exec +
é melhor, mas não vai funcionar aqui, pois não é assim que unzip
funciona.
O comando paralelo GNU é adequado para esse tipo de coisa. Depois de:
$ sudo apt-get install parallel
Então
ls *.zip | parallel unzip
Isso usará quantos núcleos você tiver, mantendo cada núcleo ocupado com um descompactação, até que tudo esteja pronto.
echo *.zip
para evitar que um possível alias ls oculte informações extras. No entanto, isso tem o mesmo problema que a resposta do @ Guru; ele quebra nos nomes de arquivos que contêm espaços em branco.
xargs
GNU Parallel não não quebrar em nomes de arquivos que contenham espaço / guia / quote. Somente se os nomes dos arquivos contiverem novas linhas, você terá que tomar cuidado extra. Por exemplo, usando:parallel unzip ::: *.zip
echo
é tão ruim quanto usar ls
. Globbing e um loop while são os mais seguros.
Se você possui muitos .zip
arquivos na sua pasta e deseja descompactá-los, abra o terminal e vá para a sua pasta usando:
cd <path_to_folder>
Agora use este comando para descompactar todo o seu .zip
arquivo:
ls *.zip | xargs -n1 unzip
echo *.zip
para evitar que um possível ls
alias oculte informações extras, mas isso ainda não resolve o problema de espaço em branco.
ls
para scripts, pois sua saída não está bem definida entre as versões. Em vez disso, observe a resposta do @terdon, pois resolve todos os problemas dessa solução.
Você pode usar o find com -exec
assim,
find . -name "*.zip" -exec unzip {} \;
Isso vai funcionar se o arquivo tem um espaço no nome.
unzip \*.zip
ou unzip '*.zip'
O óbvio unzip *.zip
não funciona, porque o shell o expande unzip foo.zip bar.zip ...
e unzip
interpreta o primeiro nome do arquivo como o arquivo zip e os seguintes nomes de arquivos como arquivos a serem extraídos desse arquivo zip.
No entanto, unzip
é um pouco incomum entre os comandos do Unix, pois ele faz suas próprias expansões globais. Se o *
arquivo não for expandido pelo shell, descompacte-o e interprete todos os nomes de arquivos resultantes como arquivos zip a serem processados. Portanto, neste caso especial, pode-se fugir sem um for
loop ou algo xargs
parecido.