Descompacte o conteúdo do arquivo, mas sem criar pasta de arquivamento

37

Eu tenho um arquivo myarchive.zip que contém muitos diretórios, arquivos, etc. Digamos que esse arquivo myarchive.zip esteja em um diretório chamado "b". Bem, quando eu uso o comando "descompacte myarchive.zip", o sistema cria um diretório por padrão chamado "myarchive" com o conteúdo do arquivo zip. Eu não quero o sistema para criar este diretório "myarchive" - Eu só quero o conteúdo a ser extraído para o diretório "b". Isso é possível?

O que tenho feito agora é simplesmente emitir um comando "cp" para copiar os arquivos do diretório recém-criado (neste caso, "myarchive" para "b") para onde eu os quero.

ScoobaSteve
fonte
8
Por padrão, unzipnão cria um diretório. Seu arquivo zip provavelmente tem o diretório em seu nível superior.
Chris Baixo
3
Você poderia usar em mvvez de cp. mv archive/* .; rmdir archive/ou similar.
Frostschutz

Respostas:

45

Minha versão do unziptem uma -jopção para não criar nenhum diretório.

tão

unzip -j /path/to/file.zip

Extrairá todos os arquivos no diretório atual sem restaurar a estrutura de diretórios armazenada no ziparquivo.

Se você desejar remover apenas um nível de diretórios do arquivo morto (extrair myarchive/dir/filecomo dir/file, não file), poderá usar bsdtar(que suporta ziparquivos além de tararquivos) e sua -sopção.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'
Stéphane Chazelas
fonte
8
Ao usar -ja estrutura do diretório de arquivamento, não é recriado e todos os arquivos são depositados na pasta de extração. Isso significa que TODAS as subpastas são descartadas. Portanto, se você tivesse zip/A/f1, zip/A/B/f2e zip/A/B/C/f3você terminaria com uma única pasta com f1, f2, f3. Fica estranho se você tiver arquivos com o mesmo nome em diferentes subpastas. Normalmente, você deseja simplesmente soltar a pasta superior e não toda a estrutura de diretórios.
Cristian Vrabie
3
@ CristianVrabie, bem, é exatamente isso que estou dizendo na resposta. Adicionei uma alternativa bsdtar para o que você está perguntando. Veja editar.
Stéphane Chazelas
3

Parece que isso é realmente simples com o bsdtar :

bsdtar --strip-components=1 -xvf file.zip

ismail
fonte
1

O que a resposta aceita não especifica como fazer, como você diz na pergunta, se você ainda deseja extrair para uma pasta específica sem usar os caminhos de pastas armazenados nos arquivos zip, pode usar a -jopção com a -dopção desta maneira :

unzip -j /path/to/file.zip -d other_folder

ou para o seu caso

unzip -j myarchive.zip -d b
Eduard Florinescu
fonte
2
Você está certo que pode fazer isso; mas não criará os subdiretórios, portanto você ainda precisará incorporar outra etapa; Tenho certeza de que o OP deseja renomear o diretório raiz do arquivo morto para outro nome, mas mantenha a estrutura restante nesse diretório.
Pryftan
-1

Se executar unzip myarchive.zipproduz um diretório myarchivecom tudo nele, isso significa que o criador do arquivo zip realmente executou o zip nesse diretório.

A única maneira de criar o que você deseja é apenas mover todo o conteúdo para fora do diretório depois de executar unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ mostra diretóriomyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ mostra o primeiro nível de myarchive (diretamente em b) }

toinetoine
fonte
11
você também precisa mv myarchive/.* .mover todos os arquivos ocultos, como .gitignore e .htaccess.
Kinjal Dixit
11
@KinjalDixit Esse era o meu pensamento também; Antoine, há um defeito fatal no seu exemplo, como Kinjai aponta: porque você usa rm -Re porque não está usando, ls -anão está mostrando se há arquivos de ponto; Agora, o que acontece quando você executa rm -Re há arquivos de ponto? Você não os copiou, então eles estão perdidos. Você realmente deve consertar isso e talvez explicar a diferença, porque é algo que tropeçará bastante nos novatos; e considere o seguinte: e se não for um arquivo que eles têm? Ou, se eles adicionarem ao comando para excluir o arquivo morto, uma vez descompactado?
Pryftan
Otoh rmdirgarantiria que ele estivesse vazio primeiro ... Mas se o usuário não souber sobre arquivos de ponto, os confundirá.
Pryftan