Descompacte o diretório específico sem criar o diretório principal

12

Eu tenho um arquivo ZIP no qual existe um diretório superior onde todos os arquivos estão armazenados:

Release/
Release/file
Release/subdirectory/file
Release/subdirectory/file2
Release/subdirectory/file3

Quero extrair tudo Release, preservando a estrutura de diretórios, mas quando executo isso:

unzip archive.zip Release/* -d /tmp

Ele cria a Releasepasta superior :

/tmp/Release/
/tmp/Release/file
/tmp/Release/subdirectory/file
/tmp/Release/subdirectory/file2
/tmp/Release/subdirectory/file3

Como posso extrair tudo dentro Release sem criar uma Releasepasta, assim:

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
Moisés
fonte
Tente istounzip archive.zip && mv Release/* .
George Udosen
@George isso ainda cria uma Releasepasta
jsta

Respostas:

5

No seu caso, tente na pasta de destino:

ln -s Release . && unzip <YourArchive>.zip

Do que você precisa remover o link que você criou:

rm Release
arca
fonte
3

O jsinalizador deve impedir a criação da pastaunzip -j archive.zip -d .

Na página do manual :

-j 

junk paths. The archive's directory structure is not recreated; 
all files are deposited in the extraction directory (by default, the
current one).
jsta
fonte
9
Acho que isso está próximo, mas o OP estava procurando ignorar apenas a criação do diretório de nível superior e preservar a estrutura de diretórios restante. a -jopção despeja todos os arquivos no diretório atual, independentemente da estrutura de diretórios no arquivo morto.
Charles Green
1

Script Python para achatar a árvore extraída

O script escrito abaixo extrai o arquivo zip e move os arquivos contidos no diretório mais alto para o diretório de trabalho atual. Esse script rápido é adaptado para atender a essa pergunta em particular, onde há um único diretório superior que contém todos os arquivos, embora algumas edições possam ser adequadas para casos mais gerais.

#!/usr/bin/env python3
import sys
import os
from zipfile import PyZipFile
for zip_file in sys.argv[1:]:
    pzf = PyZipFile(zip_file)
    namelist=pzf.namelist()
    top_dir = namelist[0]
    pzf.extractall(members=namelist[1:])
    for item in namelist[1:]:
        rename_args = [item,os.path.basename(item)]
        print(rename_args)
        os.rename(*rename_args)
    os.rmdir(top_dir)

Execução de teste

Aqui está um exemplo de como o script deve funcionar. Tudo extraído para o diretório de trabalho atual, mas o arquivo de origem pode estar no diretório diferente. O teste é realizado no arquivo zip do meu repositório pessoal do github.

$ ls                                                                                   
flatten_zip.py*  master.zip
$ ./flatten_zip.py master.zip                                                          
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
flatten_zip.py*  LICENSE  master.zip  utc_indicator.png  utc-time-indicator

Teste com o arquivo de origem em local diferente

$ mkdir test_unzip
$ cd test_unzip
$ ../flatten_zip.py  ../master.zip                                                     
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
LICENSE  utc_indicator.png  utc-time-indicator
Sergiy Kolodyazhnyy
fonte