Descompacte todos os arquivos em um diretório


203

Eu tenho um diretório de arquivos ZIP (criados em uma máquina Windows). Posso descompactá-los manualmente usando unzip filename, mas como posso descompactar todos os arquivos ZIP na pasta atual através do shell?

Usando o Ubuntu Linux Server.

Respostas:


395

Isso funciona no bash, de acordo com este link :

descompacte \ *. zip


2
Eu precisava da barra invertida com o Zsh . Não sei por que você precisaria se estivesse usando o Bash.
Don McCurdy

O que acontecerá com os arquivos duplicados? Eu acho que isso vai substituir?
Kerner1000

Funciona muito bem no macOS 😀
Ahi Tuna

1
Ao fazer isso eu recebo nome do arquivo não corresponder para todos os arquivos zip no diretório
thebeancounter

1
A versão com aspas funcionou para mim na WSL. Os nomes de arquivos também tinham espaços, o FWIW.
Max Candocia 31/03/19

107

Basta colocar algumas aspas para escapar do curinga:

unzip "*.zip"

2
+1 Este funcionou para mim. Eu tive que descompactar os nomes de arquivos com um formato específico enquanto restringia o restante. Eu apenas mantive o formato correspondente entre aspas duplas e funcionou como um encanto. A saída informa o número de arquivos processados ​​com sucesso.
Lalit Kumar B

Funcionou lindamente no subsistema Ubuntu para Windows, 18/11/2018. A resposta principal não funcionou.
julianstanley

64

O script bash a seguir extrai todos os arquivos zip no diretório atual em novos diretórios com o nome do arquivo zip, ou seja:

Os seguintes arquivos:

myfile1.zip
myfile2.zip 

Será extraído para:

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

Script de 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
Essa é a coisa para conquistar todas as coisas. Não posso acreditar que ele não foi votado mais alto
billynoah 11/11/2015

Isso não lida com espaços nos nomes de arquivos.
David Oliver

1
Basta adicionar aspas "ao nome do arquivo.
CONvid19

1
o `salvou meu dia! obrigado! Estou fazendo algum loop, descompacte, execute uma ação, copie, grep alguma coisa, remova. A coisa que faltava era como ir de arq.gz de arquivo como uma variável no script bash
thahgr

38

descompacte * .zip ou, se estiverem em subpastas, algo como

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

descompactar faz o processamento de curingas, para que um arquivo chamado "* .zip" não faça o que você espera.
precisa saber é

3
Na verdade, isso vai fazer exatamente o que é esperado, o resultado da operação de busca está sendo passado para unzip
John Bargman

1
Isso extrairá todos os arquivos zip no diretório atual. E se eu quiser que os arquivos zip (presentes nas subpastas) sejam extraídos nas respectivas subpastas?
Rishabh Agrahari

2
@RishabhAgrahari Abordei seu comentário em uma nova resposta .
jojo

para gzip'edarquivos, use gunzip -rfk .para descompactação recursiva dentro respectivas pastas
Devaroop

17

Descompacte todos os .ziparquivos e armazene o conteúdo em uma nova pasta com o mesmo nome e na mesma pasta que o .ziparquivo:

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

Esta é uma extensão da resposta de @ phatmanace e aborda o comentário de @ RishabhAgrahari :

Isso extrairá todos os arquivos zip no diretório atual. E se eu quiser que os arquivos zip (presentes nas subpastas) sejam extraídos nas respectivas subpastas?


1
para gzip'edarquivos, use gunzip -rfk .para descompactação recursiva dentro respectivas pastas
Devaroop

2
Obtendo find: illegal option -- nusando UnZip 6,00 - qualquer outra pessoa?
DannyDannyDanny

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Você esqueceu a listagem do diretório.
SaundersB

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

Isso descompactará todos os arquivos zip em novas pastas nomeadas com os nomes de arquivos dos arquivos zip.

a.zip b.zip c.zipserá descompactado em a b cpastas, respectivamente.


6

aunpack -e *.zip, com atoolinstalado. Tem a vantagem de lidar de maneira inteligente com erros e sempre descompactar subdiretórios, a menos que o zip contenha apenas um arquivo. Portanto, não há perigo de poluir o diretório atual com massas de arquivos, como ocorre unzipem um zip sem estrutura de diretório.


6

Em qualquer shell POSIX, isso será descompactado em um diretório diferente para cada arquivo zip:

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

1
Ou como one-liner:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn 19/09/18



1

Se os arquivos estiverem gzip'd. Então basta usar:

gunzip -rfk .

do diretório raiz para extrair recursivamente os arquivos nos respectivos diretórios, mantendo os originais (ou remova-os -kpara excluí-los)


0

Esta é uma variante da resposta de Pedro Lobito usando Como percorrer um diretório recursivamente para excluir arquivos com certos ensinamentos de extensões :

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 perigoso de sl. E se você tiver um arquivo chamado "-j -o -d .. jackass.zip"
geocar


-3

Usar

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

descompactar uma pasta no linux


Isso descompactará apenas um arquivo. A pergunta é para descompactar todas as pastas
Vivek Panday

Para ser justo, o título "Descompactar todos os arquivos em um diretório" pode ser ambíguo e também significa "Descompactar um único arquivo morto em um diretório separado".
jdersen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.