Entpacken Sie ein bestimmtes Verzeichnis, ohne das oberste Verzeichnis zu erstellen

11

Ich habe eine ZIP-Datei, in der sich ein oberstes Verzeichnis befindet, in dem alle Dateien gespeichert sind:

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

Ich möchte alles unter extrahieren Releaseund dabei die Verzeichnisstruktur beibehalten, aber wenn ich dies ausführe:

unzip archive.zip Release/* -d /tmp

Es wird der oberste ReleaseOrdner erstellt:

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

So kann ich alles extrahieren, Release ohne einen ReleaseOrdner zu erstellen :

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
Moses
quelle
Versuchen Sie diesunzip archive.zip && mv Release/* .
George Udosen
@ George dies erstellt noch einen ReleaseOrdner
jsta

Antworten:

5

Versuchen Sie es in Ihrem Fall im Zielordner:

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

Dann müssen Sie den von Ihnen erstellten Link entfernen:

rm Release
Arche
quelle
3

Das jFlag sollte die Ordnererstellung verhindernunzip -j archive.zip -d .

Von der Manpage :

-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
quelle
8
Ich denke, das ist nah, aber das OP wollte nur die Erstellung des Verzeichnisses der obersten Ebene überspringen und die verbleibende Verzeichnisstruktur beibehalten. Die -jOption speichert alle Dateien im aktuellen Verzeichnis, ohne Rücksicht auf die Verzeichnisstruktur im Archiv.
Charles Green
1

Python-Skript zum Reduzieren des extrahierten Baums

Das unten geschriebene Skript extrahiert die Zip-Datei und verschiebt die im obersten Verzeichnis enthaltenen Dateien aus dem aktuellen Arbeitsverzeichnis. Dieses schnelle Skript ist auf diese spezielle Frage zugeschnitten, bei der es ein einziges oberstes Verzeichnis gibt, das alle Dateien enthält, obwohl es mit wenigen Änderungen für allgemeinere Fälle geeignet gemacht werden kann.

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

Testlauf

Hier ist ein Beispiel, wie das Skript funktionieren soll. Alles, was in das aktuelle Arbeitsverzeichnis extrahiert wurde, aber die Quelldatei kann sich insgesamt in einem anderen Verzeichnis befinden. Der Test wird im Zip-Archiv meines persönlichen Github-Repositorys durchgeführt.

$ 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

Testen Sie, ob sich die Quelldatei an einem anderen Speicherort befindet

$ 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
quelle