Eu tenho um script que extrai um arquivo tar.gz para um subdiretório especificado mysubfolder :
mkdir mysubfolder; tar --extract --file=sourcefile.tar.gz --strip-components=1 --directory=mysubfolder;
Existe alguma maneira equivalente de fazer isso com um arquivo zip?
Respostas:
Como Mathias disse,
unzip
não tem essa opção, mas um script bash de uma linha pode fazer o trabalho.O problema é: a melhor abordagem depende do layout do seu arquivo. Uma solução que pressupõe que um único diretório de nível superior falhe miseravelmente se o conteúdo estiver diretamente na raiz do arquivo morto (pense
/a/foo
/b/foo
/foo
no caos de remover/a
e remover/b
).E a mesma falha acontece com
tar --strip-component
. Não existe uma solução única para todos.Assim, para retirar o directório raiz, assumindo que não é um (e única um):
Apenas verifique se os arquivos / diretórios de segundo nível não têm o mesmo nome do pai de nível superior (por exemplo
/foo/foo
). Mas/foo/bar/foo
e/foo/bar/bar
está bem. Se sim, ou você apenas quer estar seguro, pode usar um diretório temporário para extração:Se você estiver usando o Bash, poderá testar se o nível superior é um único diretório ou não:
Por falar em Bash, você deve ativar
dotglob
para incluir arquivos ocultos e pode agrupar tudo em uma única função útil:Agora coloque isso no seu
~/.bashrc
ou~/.profile
e você nunca mais precisará se preocupar com isso. Basta usar como:(observe que ele será criado automaticamente
mysubfolder
se não existir)fonte
Não consegui encontrar essa opção nas páginas de manual para
unzip
, então temo que isso seja impossível. :(No entanto, (dependendo da situação), você pode contornar isso. Por exemplo, se você tem certeza de que o único diretório de nível superior no arquivo zip é nomeado
foo-
seguido por um número de versão, você pode fazer algo assim:fonte
rm -rf foo-*
de propósito, pois isso é potencialmente perigoso. E se já houvesse uma pasta chamadafoo-bar
? Observe que a extração está sendo feita dentro da/tmp
pasta, que é esvaziada automaticamente de vez em quando.&&
: uma determinada etapa só acontece se a etapa anterior tiver sido bem-sucedida, portanto a última (arm
) será executada apenas se todas as etapas forem concluídas sem erro./tmp/some-hardcoded-folder-name
como uma pasta temporária, mas simmktemp
para isso: garante que não haverá uma pasta existente. Confira minha resposta abaixo.Você pode usar
-j
para caminhos indesejados (não crie diretórios). Isso é recomendado apenas para arquivos de nível único comuns. Arquivos com estruturas de diretórios de vários níveis serão achatados - isso pode levar a conflitos de nomes para os arquivos extraídos.Na página de manual do descompacte:
fonte