Tạo tập tin zip và bỏ qua cấu trúc thư mục


216

Tôi cần tạo một tệp zip bằng lệnh này:

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

Điều này hoạt động, nhưng tệp zip được tạo sẽ tạo cấu trúc thư mục bắt chước thư mục thành tệp thô. Đó là rất nhiều thư mục bổ sung mà tôi không cần.

Tôi đã không tìm thấy câu trả lời trong nháy mắt lướt qua trang người đàn ông hoặc một cuộc săn lùng Google.



2
Tôi đã suy nghĩ câu hỏi này có trước tất cả các trao đổi ngăn xếp khác nhưng bài đăng của siêu nhân thực sự cũ hơn bài này. Nếu có điều gì tôi có thể làm ở đây để giúp tôi biết. Đây phải là câu trả lời khá hấp dẫn vì google vẫn còn lưu lượng truy cập lớn ở đây. : D
Jake

Câu trả lời:


351

Bạn có thể sử dụng -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
Nếu -jkhông hoạt động cho thư mục của bạn (cùng với -r), hãy kiểm tra câu trả lời này
czerasz

đôi khi nó không hoạt động ... thích liên kết @czerasz;) về cơ bản là một kết hợp popd đẩy
TecHunter

36

Sử dụng -jsẽ không hoạt động cùng với -rtùy chọn.
Vì vậy, công việc xung quanh nó có thể là thế này:

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

Hoặc phiên bản nội tuyến

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

bạn có thể hướng đầu ra đến /dev/nullnếu bạn không muốn cd -đầu ra xuất hiện trên màn hình


Trên thực tế, bạn có thể muốn làm như sau:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 Làm thế nào để tạo sự khác biệt? Thay vào đó nó sẽ khiến bạn thêm không. của ParentDir (..) cho mỗi thư mục trong đường dẫn: |
Vikas Tawniya

Kết quả là như nhau, tôi đồng ý. Nhưng trong các tập lệnh tự động chạy trong nhiều môi trường khác nhau, bạn thường tránh các đường dẫn toàn cầu, vì bạn không biết đường dẫn toàn cầu sẽ là gì. Nhưng từ cd path/to/parent/dir/bạn có thể tính toán số lượng dấu chấm đôi ../một cách dễ dàng.
eddyP23

@ eddyP23 có ý nghĩa
Vikas Tawniya

33

Sử dụng -jtùy chọn:

   -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).


3

Ngoài ra, bạn có thể tạo một liên kết tượng trưng tạm thời đến tệp của mình:

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

Điều này cũng làm việc cho một thư mục.


1

Giữ lại thư mục cha unzip không phun các tệp ở mọi nơi

Khi nén thư mục, giữ thư mục mẹ trong kho lưu trữ sẽ giúp tránh xả rác thư mục hiện tại của bạn khi bạn giải nén tệp lưu trữ

Vì vậy, để tránh giữ lại tất cả các đường dẫn và vì bạn không thể sử dụng -j và -r cùng nhau (bạn sẽ gặp lỗi), bạn có thể thực hiện việc này thay thế:

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

Đây ../$(basename $PWD)là phép thuật giữ lại thư mục cha.

Vì vậy, bây giờ unzip my.zipsẽ cung cấp một thư mục chứa tất cả các tệp của bạn:

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

Thay vì xả rác thư mục hiện tại với các tệp được giải nén:

file1
file2
dir1
├── file3
├── file4

0

Chỉ cần sử dụng -jrmtùy chọn để loại bỏ các cấu trúc tệp và thư mục

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

hãy cẩn thận, -m - di chuyển các tệp đã chỉ định vào kho lưu trữ zip; trên thực tế, điều này sẽ xóa các thư mục / tệp đích sau khi thực hiện lưu trữ zip được chỉ định. Nếu một thư mục trở nên trống rỗng sau khi loại bỏ các tệp, thư mục cũng bị xóa. Không có thao tác xóa nào được thực hiện cho đến khi zip tạo tệp lưu trữ mà không gặp lỗi. Điều này rất hữu ích để bảo tồn dung lượng ổ đĩa, nhưng có khả năng gây nguy hiểm vì vậy nên sử dụng kết hợp với -T để kiểm tra kho lưu trữ trước khi xóa tất cả các tệp đầu vào.
catalint
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.