แยกเฉพาะไฟล์ที่ระบุจากไฟล์บีบอัดซิปไปยังไดเรกทอรีที่กำหนด


151

ฉันต้องการแยกไฟล์เดียวจากไฟล์ ZIP ซึ่งฉันรู้เส้นทางไป มีคำสั่งดังต่อไปนี้:

unzip -d . myarchive.zip path/to/zipped/file.txt

./path/to/zipped/file.txtแต่น่าเสียดายที่สารสกัดจากคำสั่งดังกล่าวและสร้างเส้นทางทั้งหมดไปยังไฟล์ที่ มีวิธีที่ฉันจะดึงไฟล์ออกไปในไดเรกทอรีที่ระบุหรือไม่

คำตอบ:


130

คุณสามารถแยกข้อความไปยังเอาต์พุตมาตรฐานด้วย-pตัวเลือก:

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

สิ่งนี้จะไม่ดึงข้อมูลเมตา (วันที่, การอนุญาต, ... ), เฉพาะเนื้อหาของไฟล์ นั่นคือราคาที่ต้องจ่ายเพื่อความสะดวกในการไม่ต้องย้ายไฟล์ในภายหลัง

หรือติดตั้งไฟล์เก็บถาวรเป็นไดเรกทอรีและเพียงคัดลอกไฟล์ ด้วยAVFS :

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

หรือด้วยฟิวส์ - ไปรษณีย์ :

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d

2
@TK Kocheran: ทำไมคุณไม่ลองทดสอบดูล่ะ? ฉันทดสอบคำสั่งแรกแล้วก็ใช้งานได้
ผู้ใช้ที่ไม่รู้จัก

1
@TKKocheran: ไฟล์ Jar เป็นรหัสไปรษณีย์ดังนั้นวิธีการคลายซิปและฟิวส์จึงจะใช้ได้ วิธี AVFS ยังใช้งานได้เนื่องจาก AVFS เดารูปแบบตามชื่อไฟล์และรู้เกี่ยวกับ.jar; ถ้าไฟล์ของคุณเป็นชื่อที่แตกต่างกันคุณอาจจำเป็นต้องบอก AVFS ~/.avfs$PWD/foo.apk#uzip/META-INFที่จะใช้จัดการไปรษณีย์ของมันเช่น
Gilles

1
จริงๆแล้วฉันหมายถึงการแตกไฟล์ JAR / ไบนารีออกจากไฟล์ ZIP ฉันยังไม่ได้มีโอกาสทดสอบมันคุณสามารถเห็นปัญหาใด ๆ ที่ใช้คำสั่งแรกข้างต้นเพื่อแยกไฟล์ไบนารี?
Naftuli Kay

2
@TKKocheran: ไม่มีปัญหา-pแตกไฟล์ตามเดิม ( -cทำการแปลงข้อความ)
Gilles

2
ฉันคิดว่าคำตอบของ @Myles นั้นสง่างามกว่าเพราะไม่ต้องการการเปลี่ยนเส้นทางของเอาต์พุตและยังคงไว้ซึ่งแอตทริบิวต์ของไฟล์
gertvdijk

152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

ป้อนเส้นทางแบบเต็มสำหรับไฟล์ซิปไม่ใช่แค่ชื่อไฟล์ ตรวจสอบให้แน่ใจว่ามีโครงสร้างตามที่เห็นจากภายในไฟล์ zip

นี้จะแยกไฟล์เดียวfile.txtในการmyarchive.zip/path/to/unzip/to/file.txt


18
นี่คือคำตอบที่ดีกว่า
redburn

1
ไม่ได้จัดการกับกรณีที่คุณต้องการให้ชื่อไฟล์ที่สร้างแตกต่างกัน
Oleg Vaskevich

6
พารามิเตอร์ "-j": เส้นทางขยะ โครงสร้างไดเรกทอรีของไฟล์เก็บถาวรไม่ได้ถูกสร้างขึ้นใหม่ ไฟล์ทั้งหมดจะถูกฝากไว้ในไดเรกทอรีการแยก (โดยค่าเริ่มต้นไฟล์ปัจจุบัน) พารามิเตอร์ "-d": แตกไฟล์ลงใน exdir
e1i45

1
@OlegVaskevich คำถามไม่ขอชื่อไฟล์เป้าหมายให้ต่างกัน
Tapemaster

ใช่ฉันรู้. ยังคงได้รับการโหวต :)
Oleg Vaskevich

25

เวอร์ชั่นที่เรียบง่าย:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

สิ่งนี้จะสร้างขึ้นPATH_OF_FILE_INSIDE_ARCHIVEในไดเรกทอรีปัจจุบัน แต่จะแตกไฟล์ที่ระบุเท่านั้น

หากต้องการแสดงรายการไฟล์ทั้งหมดในไฟล์เก็บถาวร Zip:

unzip -l ARCHIVE_NAME

2
ง่ายกว่าคำตอบที่ยอมรับ
FractalSpace

แน่นอนว่าทำงานได้ดีและมันง่ายกว่า Waaaay
Mahmoud Ali

2

บน macOSซึ่งโดยปกติจะใช้Info-Zip

รายการแรกปิดไฟล์เพื่อค้นหาสิ่งที่คุณต้องการ

unzip -l my.zip

จากนั้นจัดเตรียมรายการไฟล์ที่จะแยกจากไฟล์เก็บถาวร

unzip my.zip annoying/path/to/file

รวมกับ -p สำหรับ stdout

unzip -p my.zip annoying/path/to/file >./file

1
ฉันไม่เข้าใจว่าทำไมคนลงคะแนนโดยไม่มีเหตุผลที่ชัดเจน นี่เป็นคำตอบที่ถูกต้อง (ไม่ใช่สำหรับ macOS)
FractalSpace

@ เศษส่วนของสเปซมันไม่ได้เป็นอย่างนั้นมันตรงกันข้ามกับสิ่งที่ OP ต้องการ
Konrad Rudolph

กุญแจสำคัญคือการรับไฟล์ส่วนบุคคล ส่งออกไปยัง stdout และการเปลี่ยนเส้นทางโดยใช้แฟล็ก -p เป็นเรื่องเล็กน้อย แต่ฉันได้เพิ่มไว้อย่างชัดเจนแล้ว
Cameron Lowell Palmer

2

ใช้ง่าย:

unzip zipfile.zip path/inside/zip/file.txt

และจะขยายไฟล์

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php

ยังสามารถเพิ่ม-d outpathอาร์กิวเมนต์เพื่อระบุตำแหน่งของไฟล์ที่ถูกวางไว้
Efren

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