Eu tenho mais de 200 .zip
arquivos em uma pasta. Eu não quero descomprimir aqueles um por um. Eu quero extrair aqueles usando um único comando ou script. Como fazer isso.
27
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 paraxargs
. 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 queunzip
funciona.O comando paralelo GNU é adequado para esse tipo de coisa. Depois de:
Então
Isso usará quantos núcleos você tiver, mantendo cada núcleo ocupado com um descompactação, até que tudo esteja pronto.
fonte
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 usarls
. Globbing e um loop while são os mais seguros.Você pode usar o seguinte comando:
Primeiro mude o diretório no terminal para o diretório que contém os arquivos .zip:
Em seguida, execute este comando para descompactar todos os arquivos .zip:
fonte
Se você possui muitos
.zip
arquivos na sua pasta e deseja descompactá-los, abra o terminal e vá para a sua pasta usando:Agora use este comando para descompactar todo o seu
.zip
arquivo:fonte
echo *.zip
para evitar que um possívells
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,Isso vai funcionar se o arquivo tem um espaço no nome.
fonte
Um método não terminal.
Basta selecionar os arquivos zip, clicar com o botão direito do mouse em um e escolher
extract here
. Você pode selecionar todos ou apenas um número de arquivos zip por vez.fonte
unzip \*.zip
ouunzip '*.zip'
O óbvio
unzip *.zip
não funciona, porque o shell o expandeunzip foo.zip bar.zip ...
eunzip
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 umfor
loop ou algoxargs
parecido.fonte