Giải nén thư mục cụ thể mà không tạo thư mục hàng đầu


11

Tôi có một tệp ZIP trong đó có một thư mục trên cùng, nơi tất cả các tệp được lưu trữ:

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

Tôi muốn giải nén mọi thứ bên dưới Release, bảo toàn cấu trúc thư mục, nhưng khi tôi chạy nó:

unzip archive.zip Release/* -d /tmp

Nó tạo Releasethư mục trên cùng :

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

Làm thế nào tôi có thể trích xuất mọi thứ bên trong Release mà không cần tạo một Releasethư mục, như thế này:

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

Hãy thử điều nàyunzip archive.zip && mv Release/* .
George Udosen

@George điều này vẫn tạo một Releasethư mục
jsta

Câu trả lời:


5

Trong trường hợp của bạn, hãy thử trong thư mục đích:

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

Hơn bạn cần xóa liên kết bạn đã tạo:

rm Release

3

Các jcờ nên ngăn chặn việc tạo ra thư mụcunzip -j archive.zip -d .

Từ trang người đàn ông :

-j 

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

8
Tôi nghĩ rằng điều này là gần, nhưng OP đã tìm cách chỉ bỏ qua việc tạo thư mục cấp cao nhất và bảo tồn cấu trúc thư mục còn lại. các -jtùy chọn bãi tất cả các file vào thư mục hiện hành mà không quan tâm đến cấu trúc thư mục trong kho lưu trữ.
Charles Green

1

Kịch bản Python để làm phẳng cây trích xuất

Kịch bản được viết dưới đây trích xuất tệp zip và di chuyển các tệp có trong thư mục trên cùng ra khỏi thư mục hiện tại. Kịch bản nhanh này được thiết kế để phù hợp với câu hỏi cụ thể này khi có một thư mục trên cùng duy nhất chứa tất cả các tệp, mặc dù với một vài chỉnh sửa có thể được thực hiện phù hợp cho các trường hợp tổng quát hơn.

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

Chạy thử nghiệm

Đây là một ví dụ về cách kịch bản được cho là hoạt động. Mọi thứ được trích xuất vào thư mục làm việc hiện tại, nhưng tệp nguồn có thể nằm trong thư mục differet hoàn toàn. Thử nghiệm được thực hiện trên kho lưu trữ zip của kho lưu trữ github cá nhân của tôi.

$ 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

Kiểm tra với tệp nguồn ở vị trí khác nhau

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.