คลายซิปไฟล์เนื้อหา แต่ไม่สร้างโฟลเดอร์เก็บถาวร


37

ฉันมีไฟล์ myarchive.zip ที่มีหลายไดเรกทอรีไฟล์ ฯลฯ สมมติว่าไฟล์ myarchive.zip นี้อยู่ในไดเรกทอรีที่เรียกว่า "b" เมื่อฉันใช้คำสั่ง "unzip myarchive.zip" ระบบจะสร้างไดเรกทอรีโดยค่าเริ่มต้นที่เรียกว่า "myarchive" ด้วยเนื้อหาของไฟล์ zip ฉันไม่ต้องการให้ระบบสร้างไดเรกทอรี "myarchive" นี้ - ฉันต้องการให้เนื้อหาถูกแยกไปยังไดเรกทอรี "b" เป็นไปได้ไหม

สิ่งที่ฉันทำตอนนี้คือการออกคำสั่ง "cp" เพื่อคัดลอกไฟล์จากไดเรกทอรีที่สร้างขึ้นใหม่ (ในกรณีนี้ "myarchive" เป็น "b") ไปยังตำแหน่งที่ฉันต้องการ


8
ตามค่าเริ่มต้นunzipจะไม่สร้างไดเรกทอรี ไฟล์ซิปของคุณอาจมีไดเรกทอรีที่ระดับบนสุด
Chris Down

3
คุณสามารถใช้แทนmv หรือคล้ายกัน cpmv archive/* .; rmdir archive/
frostschutz

คำตอบ:


45

เวอร์ชันของฉันunzipมี-jตัวเลือกที่จะไม่สร้างไดเรกทอรีใด ๆ

ดังนั้น

unzip -j /path/to/file.zip

จะแตกไฟล์ทั้งหมดลงในไดเรกทอรีปัจจุบันโดยไม่ต้องกู้คืนโครงสร้างไดเรกทอรีที่เก็บไว้ในzipไฟล์

หากคุณต้องการลบไดเรกทอรีเพียงหนึ่งระดับจากไฟล์เก็บถาวร (แยกmyarchive/dir/fileเป็นdir/fileไม่ใช่file) คุณสามารถใช้bsdtar(ซึ่งรองรับzipไฟล์เพิ่มเติมจากtarไฟล์) แทนและ-sตัวเลือก

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'

8
เมื่อใช้-jโครงสร้างไดเรกทอรีเก็บถาวรจะไม่ถูกสร้างขึ้นใหม่และไฟล์ทั้งหมดจะถูกฝากไว้ในโฟลเดอร์การแยก ซึ่งหมายความว่าโฟลเดอร์ย่อยทั้งหมดถูกทิ้ง ดังนั้นหากคุณจะมีzip/A/f1, zip/A/B/f2และzip/A/B/C/f3คุณจะจบลงด้วยโฟลเดอร์เดียวกับ F1, F2, F3 มันจะกลายเป็นขี้ขลาดถ้าคุณมีไฟล์ที่มีชื่อเดียวกันในโฟลเดอร์ย่อยที่แตกต่างกัน โดยปกติคุณต้องการวางโฟลเดอร์ด้านบนไม่ใช่โครงสร้างไดเรกทอรีทั้งหมด
Cristian Vrabie

3
@CristianVrabie นั่นคือสิ่งที่ฉันพูดในคำตอบ ฉันได้เพิ่มทางเลือก bsdtar สำหรับสิ่งที่คุณถาม ดูการแก้ไข
Stéphane Chazelas


1

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

unzip -j /path/to/file.zip -d other_folder

หรือสำหรับกรณีของคุณ

unzip -j myarchive.zip -d b

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

-1

หากการดำเนินการunzip myarchive.zipผลิตไดเรกทอรีที่myarchiveมีทุกอย่างในนั้นนั่นหมายความว่าผู้สร้างไฟล์ zip ดำเนินการ zip จริงในไดเรกทอรีนั้น

วิธีเดียวในการสร้างสิ่งที่คุณต้องการคือเพียงแค่ย้ายเนื้อหาทั้งหมดนอกไดเรกทอรีหลังจากที่คุณดำเนินการunzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ แสดงไดเรกทอรีmyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ แสดงระดับแรกของ myarchive (โดยตรงb) }


1
นอกจากนี้คุณยังต้อง a mv myarchive/.* .เพื่อย้ายไฟล์ที่ซ่อนอยู่ทั้งหมดเช่น. gitignore และ. htaccess
Kinjal Dixit

1
@KinjalDixit นั่นคือความคิดของฉันด้วย แอนทอนมีข้อบกพร่องร้ายแรงในตัวอย่างของคุณเมื่อ Kinjai ชี้ให้เห็น: เพราะคุณใช้rm -Rและเพราะคุณไม่ได้ใช้ls -aคุณจะไม่แสดงหากมีไฟล์จุดใด ๆ ตอนนี้จะเกิดอะไรขึ้นเมื่อคุณเรียกใช้rm -Rและมีจุดไฟล์อยู่ คุณไม่ได้คัดลอกพวกเขาดังนั้นพวกเขาจะหายไป คุณควรแก้ไขและอธิบายความแตกต่างเพราะมันเป็นสิ่งที่จะทำให้มือใหม่มากขึ้น และพิจารณาสิ่งนี้ถ้าเกิดว่ามันไม่ใช่ไฟล์เก็บถาวร หรือถ้าพวกเขาเพิ่มไปยังคำสั่งเพื่อลบที่เก็บถาวรเมื่อมันไม่มีการบีบอัด?
Pryftan

Otoh rmdirจะทำให้แน่ใจว่าว่างเปล่าก่อน ... แต่ถ้าผู้ใช้ไม่ทราบเกี่ยวกับจุดไฟล์มันจะทำให้พวกเขาสับสน
Pryftan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.