Em várias ocasiões, digamos que eu tenha a.zip
, que é descompactado em a/*
si mesmo.
No entanto, muitas vezes existem arquivos zip que colocam todo o seu conteúdo no diretório atual. Isso exige que eu crie manualmente um diretor a
e descompacte nele.
Mas se como política eu sempre crio um diretório, e o zip acaba sendo do primeiro tipo, minha estrutura parece a/a/*
que não é a ideal.
Existe uma maneira de descompactar a.zip
independentemente a/*
do seu tipo entre os dois tipos que descrevi acima?
Responder1
Experimente isto:
archive="archive.zip"
has_parent=$(unzip -l "$archive" | tail -n+4 | head -n-2 | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
if test "$has_parent" -eq 1; then
unzip $archive
else
dir="./$(basename ${archive%%.zip})"
mkdir "$dir"
unzip -d "$dir" $archive
fi
Se estiver usando, zipinfo
você pode apertar $has_parent
a linha para isso:
has_parent=$(zipinfo -1 "$archive" | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
A ideia é simples - se houver vários arquivos no nível raiz do arquivo, obviamente irá destruir seu diretório atual se você descompactá-lo, portanto, você deve criar um diretório pai antecipadamente e descompactar os arquivos nele. Caso contrário, se todos os arquivos no arquivo tiverem o mesmo pai, não há problema em descompactar no diretório atual.
Responder2
Use zipinfo
para exibir o conteúdo zip.:
$ zipinfo -1 a.zip
Porém, isso provavelmente não responde à sua pergunta se você estiver procurando uma resposta de automação.
Editar:O que você pode fazer é verificar cada linha de saída em zipinfo
busca de um caractere de barra. Se houver uma linha faltando o caractere, você sabe que ela está localizada na raiz do arquivo zip.
Infelizmente, não consigo pensar exatamente em como fazer isso no topo da minha cabeça. Não tenho certeza se funcionará, mas aqui está um comando não testado:
$ MKROOT=0
$ for X in $(zipinfo -1 a.zip); do $(echo "${X}" | grep "/"); if test "$?" -gt "0"; then MKROOT=1; fi; done
$ if test "${MKROOT}" -gt "0"; then mkdir "a"; cd "a"; unzip "../a.zip"; else unzip "a.zip"; fi
Editar:A sugestão de Mark Perryman é provavelmente melhor. Acabei de perceber que meu comando verifica se os arquivos estão contidos em subpastas, mas não verifica se todos estão contidos na mesma pasta raiz.