Unzip direktori spesifik tanpa membuat direktori teratas

12

Saya memiliki file ZIP di mana ada direktori teratas tempat semua file disimpan:

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

Saya ingin mengekstrak semuanya di bawah Release, mempertahankan struktur direktori, tetapi ketika saya menjalankan ini:

unzip archive.zip Release/* -d /tmp

Itu menciptakan Releasefolder teratas :

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

Bagaimana saya bisa mengekstrak semua yang ada di dalamnya Release tanpa membuat Releasefolder, seperti ini:

/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
Musa
sumber
Coba iniunzip archive.zip && mv Release/* .
George Udosen
@ George ini masih membuat Releasefolder
jsta

Jawaban:

5

Dalam kasus Anda, coba di folder target:

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

Daripada Anda perlu menghapus tautan yang Anda buat:

rm Release
tabut
sumber
3

The jbendera harus mencegah pembuatan folderunzip -j archive.zip -d .

Dari halaman 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
sumber
9
Saya pikir ini dekat, tetapi OP hanya ingin melewati pembuatan direktori tingkat atas dan mempertahankan struktur direktori yang tersisa. yang -jpilihan kesedihan semua file ke dalam direktori saat ini tanpa memperhatikan struktur direktori dalam arsip.
Charles Green
1

Skrip python untuk meratakan pohon yang diekstraksi

Script yang ditulis di bawah ini mengekstrak file zip dan memindahkan file yang ada di dalam direktori paling atas ke direktori kerja saat ini. Skrip cepat ini dirancang agar sesuai dengan pertanyaan khusus ini di mana ada satu direktori teratas yang berisi semua file, meskipun dengan beberapa pengeditan dapat dibuat cocok untuk kasus yang lebih umum.

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

Uji coba

Berikut ini contoh cara kerja skrip. Semuanya diekstraksi ke direktori kerja saat ini, tetapi file sumber dapat berada di direktori differet sama sekali. Tes ini dilakukan pada arsip zip repositori github pribadi saya.

$ 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

Tes dengan file sumber berada di lokasi yang berbeda

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