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 bash
script?
No momento estou usando unzip
para 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 dtrx
em 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á).