Rozpakuj określony katalog bez tworzenia katalogu głównego

12

Mam plik ZIP, w którym znajduje się główny katalog, w którym przechowywane są wszystkie pliki:

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

Chcę wyodrębnić wszystko poniżej Release, zachowując strukturę katalogów, ale po uruchomieniu tego:

unzip archive.zip Release/* -d /tmp

Tworzy górny Releasefolder:

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

Jak mogę wyodrębnić wszystko wewnątrz Release bez tworzenia Releasefolderu, takie jak to:

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

źródło
Spróbuj tegounzip archive.zip && mv Release/* .
George Udosen
@George nadal tworzy Releasefolder
jsta

Odpowiedzi:

6

W twoim przypadku spróbuj w folderze docelowym:

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

Następnie musisz usunąć utworzony link:

rm Release
arka
źródło
3

jFlaga powinna uniemożliwiać tworzenie folderówunzip -j archive.zip -d .

Od strony 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).
jsta
źródło
9
Myślę, że to już blisko, ale OP chciał tylko pominąć tworzenie katalogu najwyższego poziomu i zachować pozostałą strukturę katalogów. -jopcja zrzuca wszystkie pliki w bieżącym katalogu, bez względu na strukturę katalogów w archiwum.
Charles Green,
1

Skrypt Pythona do spłaszczania wyodrębnionego drzewa

Skrypt napisany poniżej wyodrębnia plik zip i przenosi z niego pliki znajdujące się w najwyższym katalogu do bieżącego katalogu roboczego. Ten szybki skrypt jest dostosowany do tego konkretnego pytania, w którym znajduje się jeden najwyższy katalog, który zawiera wszystkie pliki, choć za pomocą kilku edycji można go dostosować do bardziej ogólnych przypadków.

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

Testowe uruchomienie

Oto przykład działania skryptu. Wszystko wyodrębniono do bieżącego katalogu roboczego, ale plik źródłowy może znajdować się w innym katalogu. Test jest przeprowadzany w archiwum zip mojego osobistego repozytorium 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

Testuj, gdy plik źródłowy znajduje się w innej lokalizacji

$ 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
źródło