você está aqui: Home  → Arquivo de Mensagens

Ebook Gratuito: Dá para fazer em Shell?, com o Prof. Julio Neves

Unzip diversos arquivos a partir da linha de comando

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 4 de abril de 2021

Outro dia eu estava tentando fazer a expansão de vários arquivos zip a partir da linha de comando. Mas não estava funcionando. Eu pensava que um arquivo zip era continuação do outro, antigamente se fazia muito isto para fazer backup de arquivos pessoais, em que cada arquivo zipado deveria caber em um disquete de 1.44MB. Muito tempo mesmo, né?

Olhando a documentação (man unzip) não achei nenhuma diretiva que indicasse como processar um arquivo zip multivolume.

Vamos então dar uma olhada no que aconteceu.

Eu tenho um diretório com três arquivos zip: arq1.zip, arq2.zip, arq3.zip.

$ unzip *.zip
Archive:  arq1.zip
caution: filename not matched:  arq2.zip
caution: filename not matched:  arq3.zip

O que aconteceu aqui? Para entender o que houve, precisamos primeiro entender como a linha de comando funciona.

Quando você usa o asterisco (*) o shell fará uma expansão e enviará o resultado ao programa, ou seja, no nosso caso, não é o comando unzip que fará a expansão. Isto significa que o que o shell passou para o comando unzip é o seguinte:

$ unzip arq1.zip arq2.zip arq3.zip

Aparentemente nada errado com isto, muitos programas aceitam algo do tipo como argumentos válidos. Mas o comando unzip interpreta uma linha de comando assim de forma diferente.

O primeiro argumento que o shell enviou ao comando unzip é arq1.zip, que é interpretado como o arquivo zip a ser processado. Até aqui tudo bem. Os argumentos seguintes, arq2.zip e arq3.zip são interpretados como arquivos que devem ser localizados dentro de arq1.zip e extraídos. Só que dentro de arq1.zip não existe nenhum arquivo chamado arq2.zip ou arq3.zip, daí o erro que você viu.

Qual a forma correta então de se proceder?

Simples, você precisa fazer com que o shell não faça a expansão de parâmetros e que este trabalho seja feito pelo próprio comando unzip.

$ unzip '*.zip'
Archive:  arq1.zip
  inflating: 1.png                   
  inflating: 2.png                   
  inflating: 3.png                   

Archive:  arq3.zip
  inflating: 4.png
  inflating: 5.png
  inflating: 6.png

Archive:  arq2.zip
  inflating: 7.png
  inflating: 8.png
  inflating: 9.png

3 archives were successfully processed.

Para impedir que o shell interprete o asterisco (*) você também pode fazer assim:

$ unzip \*.zip

e também assim:

$ unzip "*.zip"

Ao delimitarmos a expansão de caracteres das formas ilustradas acima, nós instruímos o shell a não fazer a expansão de caracteres, deixando esta tarefa a cargo do comando unzip.

Como o Prof. Julio Neves nos alerta sempre em seus artigos e cursos, é importante que entendamos como o shell pensa 😊

Referência

Unzip Multiple Files from Linux Command Line



Veja a relação completa dos artigos de Rubens Queiroz de Almeida