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

4

Vamos supor que eu tenha um arquivo ZIP com o qual o conteúdo pode se 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 parecer assim

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

e agora eu teria meu script bash extrair esses arquivos, mas em qualquer caso ele deve ser extraído para /var/sample/ , então será 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 via um script bash ?

No momento estou usando unzip para extrair arquivos zip, mas estou aberto para qualquer outra ferramenta de linha de comando, se seria mais fácil usá-lo.

    
por miho 10.10.2014 / 19:31

2 respostas

3

Eu sugeriria simplesmente:

  • Extraia em 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 para um nível e elimine o subdiretório original.

A propósito, fazer um arquivo (tar, zip, o que for) sem ter todos os membros do arquivo dentro de um subdiretório é EVIL Eu não sei porque as pessoas fazem isso!

    
por 10.10.2014 / 19:35
3

Existem várias ferramentas inteligentes de extração (descobri depois que escrevi uma para mim). Você pode querer olhar para dtrx (instale com sudo apt-get install dtrx ).

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

    
por 10.10.2014 / 19:49