Decomprimi la directory specifica senza creare la directory principale


12

Ho un file ZIP in cui esiste una directory principale in cui sono memorizzati tutti i file:

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

Voglio estrarre tutto sotto Release, preservando la struttura della directory, ma quando eseguo questo:

unzip archive.zip Release/* -d /tmp

Crea la Releasecartella principale :

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

Come posso estrarre tutto all'interno Release senza creare una Releasecartella, in questo modo:

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

Prova questounzip archive.zip && mv Release/* .
George Udosen il

@George questo crea ancora una Releasecartella
jsta

Risposte:


5

Nel tuo caso, prova nella cartella di destinazione:

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

Quindi devi rimuovere il link che hai creato:

rm Release

3

Il jflag dovrebbe impedire la creazione di cartelleunzip -j archive.zip -d .

Dalla pagina man :

-j 

junk paths. The archive's directory structure is not recreated; 
all files are deposited in the extraction directory (by default, the
current one).

9
Penso che questo sia vicino, ma l'OP stava cercando di saltare solo la creazione della directory di livello superiore e preservare la struttura di directory rimanente. l' -jopzione scarica tutti i file nella directory corrente indipendentemente dalla struttura della directory nell'archivio.
Charles Green,

1

Script Python per appiattire l'albero estratto

Lo script scritto qui sotto estrae il file zip e sposta i file contenuti nella directory più in alto fuori dalla directory corrente di lavoro. Questo script veloce è adattato per soddisfare questa particolare domanda in cui esiste un'unica directory più in alto che contiene tutti i file, anche se con poche modifiche può essere resa adatta a casi più generali.

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

Prova

Ecco un esempio di come dovrebbe funzionare lo script. Tutto viene estratto nella directory di lavoro corrente, ma il file di origine può trovarsi in una directory completamente diversa. Il test viene eseguito sull'archivio zip del mio repository github personale.

$ 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

Test con il file di origine in una posizione diversa

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.