Làm cách nào để tạo một zip có nhiều tệp mà không cần thư mục con?


12

Tình thế ban đầu:

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

Những gì tôi cần làm:

Tôi muốn tạo một zip chứa d0, d1 và d4 phải có cấu trúc rơi:

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

Những gì tôi đã thử:

Tôi đã thử nó với zip myfiles d0 f1/d1 f2/f3/d4. Nhưng điều này giữ cấu trúc thư mục gốc, đó không phải là điều tôi muốn.

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

Câu hỏi Làm thế nào để tạo một zip có nhiều tệp mà không cần các thư mục con?

Câu trả lời:


17

Theo cách thủ công, bạn có thể tạo tệp zip và cập nhật nó:

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

Các dấu ngoặc đơn tạo ra các ô con và hiệu ứng của cdchỉ tồn tại trong lớp con, vì vậy bạn không phải cdquay lại thư mục gốc.

Nếu d1, d2v.v ... thực sự là các tệp và không phải là thư mục, thì hãy sử dụng -jtùy chọn:

-j
--junk-path
Lưu trữ chỉ tên của một tệp đã lưu (rác đường dẫn) và không lưu trữ tên thư mục. Theo mặc định, zip sẽ lưu trữ đường dẫn đầy đủ (liên quan đến thư mục hiện tại).


19

Bạn có thể sử dụng findđể lấy danh sách tệp và thực thi zip -j myfilesđể đóng gói chúng bỏ qua các đường dẫn:

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

Thí dụ

$ 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

Tuy nhiên, điều này chỉ làm việc cho các tập tin , thư mục sẽ bị bỏ qua zip -j. Để làm việc này cho các thư mục quá, nói rằng chúng ta muốn để đóng gói d0, d1và toàn bộ f3thư mục trong ví dụ trên, các finddòng được một chút phức tạp hơn:

$ 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

Sử dụng tùy chọn -j sẽ xóa đường dẫn khỏi tệp.

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

tài liệu tham khảo


nếu bất kỳ đường dẫn nào bạn đi qua không phải là tệp mà là thư mục, các thư mục đó sẽ không được thêm vào ziptệp với -jtùy chọn.
Dan

@dan - nếu bạn muốn tất cả các tệp trong một thư mục không có đường dẫn sau đózip -j myfiles directory/*
ravery
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.