สร้างไฟล์ zip และละเว้นโครงสร้างไดเร็กทอรี


218

ฉันต้องการสร้างไฟล์ zip โดยใช้คำสั่งนี้:

zip /dir/to/file/newZip /data/to/zip/data.txt

ใช้งานได้ แต่ไฟล์ซิปที่สร้างขึ้นสร้างโครงสร้างไดเรกทอรีที่ลอกเลียนแบบไดเรกทอรีไปยังไฟล์ดิบ เป็นโฟลเดอร์พิเศษมากมายที่ฉันไม่ต้องการ

ฉันไม่พบคำตอบในภาพรวมคร่าวๆของ man man หรือ Google Hunt



2
ฉันคิดว่าคำถามนี้มีการคาดการณ์ล่วงหน้าของการแลกเปลี่ยนสแต็กอื่น ๆ ทั้งหมด แต่อนิจจาโพสต์ของ superer's กว่าเก่ากว่าอันนี้ หากมีสิ่งที่ฉันสามารถทำได้ที่นี่เพื่อช่วยแจ้งให้ฉันทราบ นี่ต้องเป็นคำตอบที่ค่อนข้างร้อนแรงเนื่องจาก Google ยังคงมีปริมาณการใช้งานที่นี่ : D
Jake

คำตอบ:


353

-jคุณสามารถใช้

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).

19
หาก-jไม่ได้ผลสำหรับไดเรกทอรีของคุณ (ร่วมกับ-r) เช็คเอาคำตอบนี้
czerasz

บางครั้งมันก็ไม่ทำงาน ... ชอบลิงค์ @czerasz;) ซึ่งโดยทั่วไปแล้วเป็นคำสั่งผสมแบบ pushd popd
TecHunter

36

การใช้-jจะไม่ทำงานพร้อมกับ-rตัวเลือก
ดังนั้นการแก้ไขมันอาจเป็นเช่นนี้:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

หรือรุ่นในบรรทัด

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

คุณสามารถนำเอาท์พุทไปที่/dev/nullถ้าคุณไม่ต้องการให้cd -เอาท์พุทปรากฏบนหน้าจอ


ที่จริงแล้วคุณอาจต้องการทำสิ่งต่อไปนี้:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 มันสร้างความแตกต่างได้อย่างไร? มันจะทำให้คุณไม่เพิ่ม ของ parentDir (.. ) สำหรับแต่ละไดเรกทอรีในพา ธ : |
Vikas Tawniya

ผลลัพธ์เหมือนกันฉันเห็นด้วย แต่ในสคริปต์อัตโนมัติที่ทำงานในสภาพแวดล้อมที่แตกต่างกันคุณมักจะหลีกเลี่ยงเส้นทางทั่วโลกเพราะคุณไม่รู้ว่าเส้นทางทั่วโลกจะเป็นอย่างไร แต่จากที่cd path/to/parent/dir/คุณสามารถคำนวณจำนวนจุดสองจุด../ได้อย่างง่ายดาย
eddyP23

@ eddyP23 เข้าท่า
Vikas Tawniya

33

ใช้-jตัวเลือก:

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).

18

ค่อนข้างเกี่ยวข้อง - ฉันกำลังมองหาวิธีแก้ไขเช่นเดียวกันกับไดเรกทอรี น่าเสียดายที่-jตัวเลือกไม่ทำงานสำหรับสิ่งนี้ :(

นี่คือทางออกที่ดีเกี่ยวกับวิธีการทำ: /superuser/119649/avoid-unwanted-path-in-zip-file


3

หรือคุณสามารถสร้างลิงก์สัญลักษณ์ชั่วคราวไปยังไฟล์ของคุณ:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

สิ่งนี้ใช้ได้สำหรับไดเรกทอรีด้วย


1

เก็บไดเรกทอรีหลักดังนั้นunzipอย่าคายไฟล์ทุกที่

เมื่อซิปไดเร็กทอรีการเก็บไดเร็กทอรีพาเรนต์ในไฟล์เก็บถาวรจะช่วยหลีกเลี่ยงการทิ้งไดเร็กทอรีปัจจุบันของคุณเมื่อคุณคลายซิปไฟล์เก็บถาวรในภายหลัง

ดังนั้นเพื่อหลีกเลี่ยงการเก็บพา ธ ทั้งหมดและเนื่องจากคุณไม่สามารถใช้ -j และ -r ร่วมกัน (คุณจะได้รับข้อผิดพลาด) คุณสามารถทำสิ่งนี้แทน:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

../$(basename $PWD)คือความมหัศจรรย์ที่ยังคงรักษาไดเรกทอรีแม่

ดังนั้นตอนนี้unzip my.zipจะให้โฟลเดอร์ที่มีไฟล์ทั้งหมดของคุณ:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

แทนที่จะทิ้งไดเรกทอรีปัจจุบันด้วยไฟล์ที่คลายซิปแล้ว:

file1
file2
dir1
├── file3
├── file4

0

เพียงใช้-jrmตัวเลือกเพื่อลบโครงสร้างไฟล์และไดเรกทอรี

zip -jrm /path/to/file.zip /path/to/file

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