Descomprima el directorio específico sin crear el directorio superior

12

Tengo un archivo ZIP en el que hay un directorio superior donde se almacenan todos los archivos:

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

Quiero extraer todo debajo Release, preservando la estructura del directorio, pero cuando ejecuto esto:

unzip archive.zip Release/* -d /tmp

Crea la Releasecarpeta superior :

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

Cómo puedo extraer todo dentro Release sin crear una Releasecarpeta, como esta:

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
Moisés
fuente
Prueba estounzip archive.zip && mv Release/* .
George Udosen el
@ George esto todavía crea una Releasecarpeta
jsta

Respuestas:

5

En su caso, intente en la carpeta de destino:

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

De lo que necesita para eliminar el enlace que ha creado:

rm Release
arca
fuente
3

La jbandera debería evitar la creación de carpetasunzip -j archive.zip -d .

Desde la página del 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
fuente
99
Creo que esto está cerca, pero el OP solo buscaba omitir la creación del directorio de nivel superior y preservar la estructura de directorios restante. la -jopción volca todos los archivos en el directorio actual sin tener en cuenta la estructura del directorio en el archivo.
Charles Green
1

Script de Python para aplanar el árbol extraído

El script escrito a continuación extrae el archivo zip y mueve los archivos contenidos dentro del directorio superior al directorio de trabajo actual. Este script rápido está diseñado para adaptarse a esta pregunta en particular, donde hay un único directorio superior que contiene todos los archivos, aunque con algunas ediciones puede hacerse adecuado para casos más generales.

#!/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)

Prueba de funcionamiento

Aquí hay un ejemplo de cómo se supone que funciona el script. Todo se extrae al directorio de trabajo actual, pero el archivo fuente puede estar en un directorio completamente diferente. La prueba se realiza en el archivo zip de mi repositorio personal de 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

Prueba con el archivo fuente en una ubicación 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
fuente