จะสร้างไฟล์ zip ที่มีหลายไฟล์โดยไม่มีโฟลเดอร์ย่อยได้อย่างไร?


12

สถานการณ์เริ่มต้น:

.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

ฉันต้องทำอะไร:

ฉันต้องการสร้างซิปที่มี d0, d1 และ d4 ซึ่งต้องมีโครงสร้างที่ร่วงหล่น:

.
├── d0
├── d1
└── d4

สิ่งที่ฉันได้ลองไปแล้ว:

zip myfiles d0 f1/d1 f2/f3/d4ฉันพยายามกับ แต่นี่จะเก็บโครงสร้างโฟลเดอร์ดั้งเดิมซึ่งไม่ใช่สิ่งที่ฉันต้องการ

.
├── d0
├── f1
│   └── d1
└── f2
    └── f3
        └── d4

คำถาม วิธีสร้างซิปที่มีหลายไฟล์โดยไม่มีโฟลเดอร์ย่อย?

คำตอบ:


17

คุณสามารถสร้างไฟล์ zip และอัปเดตด้วยตนเอง:

zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)

วงเล็บสร้าง subshells และเอฟเฟกต์ของสิ่งcdเดียวเท่านั้นใน subshell ดังนั้นคุณไม่จำเป็นต้องcdกลับไปที่ไดเรกทอรีดั้งเดิม

หากd1, d2ฯลฯ เป็นไฟล์จริงและไม่ใช่ไดเร็กทอรีเองให้ใช้-jตัวเลือก:

-j
- เส้นทาง
ขยะเก็บเพียงชื่อของไฟล์ที่บันทึกไว้ (เส้นทางขยะ) และไม่เก็บชื่อไดเรกทอรี โดยค่าเริ่มต้น zip จะเก็บเส้นทางแบบเต็ม (สัมพันธ์กับไดเรกทอรีปัจจุบัน)


19

คุณสามารถใช้findเพื่อรับรายการไฟล์และดำเนินการzip -j myfilesเพื่อแพ็คไฟล์โดยไม่สนใจพา ธ :

find . -name "d[014]" -exec zip -j myfiles {} +

ตัวอย่าง

$ tree
.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

$ find . -name "d[014]" -exec zip -j myfiles {} +
  adding: d1 (stored 0%)
  adding: d4 (stored 0%)
  adding: d0 (stored 0%)

$ unzip -l myfiles.zip
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-09 10:47   d1
        0  2017-10-09 10:48   d4
        0  2017-10-09 10:47   d0
---------                     -------
        0                     3 files

อย่างไรก็ตามเรื่องนี้ทำงานให้เฉพาะไฟล์zip -jไดเรกทอรีจะได้รับการปฏิเสธโดย ที่จะได้รับการทำงานนี้ไดเรกทอรีเกินไปบอกว่าเราต้องการที่จะแพ็คd0, d1และทั้งf3ไดเรกทอรีในตัวอย่างข้างต้นfindสายได้รับเพียงเล็กน้อยที่ซับซ้อนมากขึ้น:

$ find . \( -name "d[01]" -o -name "f3" \) -exec sh -c 'p=$(pwd); for i in $0 $@; do cd ${i%/*}; zip -ur "$p"/myfiles ${i##*/}; cd "$p"; done' {} +
        zip warning: /home/dessert/myfiles.zip not found or empty
  adding: d1 (stored 0%)
  adding: f3/ (stored 0%)
  adding: f3/d3 (stored 0%)
  adding: f3/d2 (stored 0%)
  adding: f3/d4 (stored 0%)
  adding: d0 (stored 0%)
$ unzip -l myfiles.zip 
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-11 10:18   d1
        0  2017-10-11 10:19   f3/
        0  2017-10-11 10:19   f3/d3
        0  2017-10-11 10:19   f3/d2
        0  2017-10-11 10:19   f3/d4
        0  2017-10-11 10:17   d0
---------                     -------
        0                     6 files

18

การใช้ตัวเลือก -j จะลบพา ธ ออกจากไฟล์

zip -j myfiles d0 f1/d1 f2/f3/d4 

การอ้างอิง


หากเส้นทางใด ๆ ที่คุณผ่านไม่ได้เป็นไฟล์ แต่เป็นไดเรกทอรีไดเรกทอรีเหล่านั้นจะไม่ถูกเพิ่มลงในzipไฟล์พร้อม-jตัวเลือก
ด่าน

@dan - หากคุณต้องการไฟล์ทั้งหมดในไดเรกทอรีโดยไม่ต้องใส่พา ธzip -j myfiles directory/*
ravery
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.