แตกไฟล์ที่ระบุโดยไม่ต้องสร้าง top directory


12

ฉันมีไฟล์ ZIP ซึ่งมีไดเรกทอรีบนสุดที่เก็บไฟล์ทั้งหมด:

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

ฉันต้องการที่จะแยกทุกอย่างภายใต้Releaseการรักษาโครงสร้างไดเรกทอรี แต่เมื่อฉันเรียกใช้นี้:

unzip archive.zip Release/* -d /tmp

มันสร้างReleaseโฟลเดอร์ด้านบน:

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

ฉันจะดึงทุกสิ่งภายในได้อย่างไรRelease โดยไม่ต้องสร้างReleaseโฟลเดอร์เช่นนี้

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

ลองสิ่งนี้unzip archive.zip && mv Release/* .
George Udosen

@Gorge นี้ยังคงสร้างReleaseโฟลเดอร์
jsta

คำตอบ:


5

ในกรณีของคุณลองในโฟลเดอร์เป้าหมาย:

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

กว่าที่คุณจะต้องลบลิงค์ที่คุณสร้าง:

rm Release

3

การjตั้งค่าสถานะควรป้องกันการสร้างโฟลเดอร์unzip -j archive.zip -d .

จากหน้าคน :

-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
ฉันคิดว่านี่ใกล้ แต่ OP ต้องการค้นหาข้ามการสร้างไดเรกทอรีระดับบนสุดและรักษาโครงสร้างไดเรกทอรีที่เหลืออยู่ -jตัวเลือกทิ้งไฟล์ทั้งหมดลงในไดเรกทอรีปัจจุบันโดยไม่คำนึงถึงโครงสร้างไดเรกทอรีในการเก็บ
ชาร์ลส์กรีน

1

สคริปต์ Python สำหรับต้นไม้ที่ถูกดึงให้แบนราบ

สคริปต์ที่เขียนด้วยเบลโลว์จะแยกไฟล์ zip และย้ายไฟล์ที่อยู่ในไดเรกทอรีระดับบนสุดออกไปยังไดเรกทอรีที่ใช้งานในปัจจุบัน สคริปต์ด่วนนี้ได้รับการปรับแต่งให้เหมาะสมกับคำถามเฉพาะนี้ซึ่งมีไดเรกทอรีระดับบนสุดหนึ่งไดเรกทอรีที่มีไฟล์ทั้งหมดแม้ว่าจะมีการแก้ไขเพียงเล็กน้อยที่สามารถทำได้สำหรับกรณีทั่วไป

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

ทดสอบการทำงาน

นี่คือตัวอย่างของวิธีที่สคริปต์ควรทำงาน ทุกสิ่งที่แยกไปยังไดเรกทอรีการทำงานปัจจุบัน แต่ไฟล์ต้นฉบับสามารถอยู่ในไดเรกทอรี differet โดยสิ้นเชิง การทดสอบจะดำเนินการในไฟล์ zip ของที่เก็บ 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

ทดสอบกับไฟล์ต้นฉบับที่อยู่ในตำแหน่งอื่น

$ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.