Descompacte no diretório, independente se o diretório estiver contido no ZIP

Descompacte no diretório, independente se o diretório estiver contido no ZIP

Vamos supor que eu tenha um arquivo ZIP cujo conteúdo pode parecer

# file: with_out_dir.zip
file1.txt
file2.cpp
file3.js
some_sub_dir/
- file_in_subdir.txt
file4.xml

mas também pode ser assim

# file: with_dir.zip
archive/
- file1.txt
- file2.cpp
- file3.js
- some_sub_dir/
-- file_in_subdir.txt
- file4.xml

e agora eu gostaria que meu script bash extraísse esses arquivos, mas em qualquer caso ele deveria ser extraído para que /var/sample/ficasse assim:

# expected output
/var/
- sample/
-- file1.txt
-- file2.cpp
-- file3.js
-- some_sub_dir/
--- file_in_subdir.txt
-- file4.xml

Qual é a melhor maneira de fazer isso através de um bashscript?

No momento estou usando unzippara extrair arquivos zip, mas estou aberto para qualquer outra ferramenta de linha de comando, se for mais fácil de usar.

Responder1

Eu sugeriria simplesmente:

  • Extraia para um novo diretório
  • Se, após a extração, o novo diretório contiver exatamente um subdiretório, mova todos os arquivos dentro dele um nível acima e livre-se do subdiretório original.

A propósito, fazendo um arquivo (tar, zip, qualquer coisa)semter todos os membros do arquivo dentro de um subdiretório éMAL. Não sei por que as pessoas fazem isso!

Responder2

Existem várias ferramentas de extração inteligentes por aí (que descobri depois de escrever uma para mim). Você pode querer dar uma olhada em dtrx(instalar com sudo apt-get install dtrx).

dtrx semprecria o diretório de nível superior se ele ainda não estiver no arquivo. Adaptar seu script bash wrapper (que chama dtrxem vez de unzip) torna-se muito mais simples, pois basta afastar os subdiretórios e remover o diretório de nível superior (já que o último está sempre lá).

informação relacionada