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.

Lennie De Villiers
fonte

Respostas:

395

Isso funciona no bash, de acordo com este link :

descompacte \ *. zip

ChristopheD
fonte
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"
ghostdog74
fonte
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
CONvid19
fonte
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 {} \;
phatmanace
fonte
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?

jojo
fonte
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.

Jahid
fonte
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.

kampu
fonte
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
Jeff Fisher
fonte
1
Ou como one-liner:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn 19/09/18
2

Usa isto:

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

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

Anurag Dalia
fonte
1
Ótimo para mim. Descompacte em suas subpastas respectivamente
inscreva-se em
É mais seguro fazer o for file in *.zip; do ...certo?
Peterflynn 19/09/19
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)

Devaroop
fonte
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
do utilizador
fonte
-2
for i in `ls *.zip`; do unzip $i; done
Dominik
fonte
14
Uso perigoso de sl. E se você tiver um arquivo chamado "-j -o -d .. jackass.zip"
geocar
-2

Para descompactar todos os arquivos em um diretório, digite este cmd no terminal:

unzip '*.zip'
Yacine ELgoub
fonte
esta resposta é uma duplicata de stackoverflow.com/a/2376135/6948900
Mikhail Antonov
-3

Usar

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

descompactar uma pasta no linux

Mohit Singh
fonte
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