Xóa tệp duy nhất khỏi kho lưu trữ zip trên Linux


75

Tôi có một kho lưu trữ zip (được tạo tự động trong một tập lệnh có -j -rcờ) và tôi muốn xóa một tệp khỏi nó. Tôi đã cố gắng như tài liệu.

zip -d "picture_43_9.jpg" gallery.zip

nhưng tôi gặp lỗi này:

zip warning: picture_43_9.jpg not found or empty   
zip error: Nothing to do! (picture_43_9.jpg)  

Dù sao, đó ví dụ một tập tin bên trong các kho lưu trữ và nó không phải là rỗng:

unzip -l .../gallery.zip | grep -i 43_9.jpg  
1477092  2013-05-22 14:23   picture_43_9.jpg 

Bất cứ ý tưởng về những gì tôi đang làm sai?

Câu trả lời:


103

Bạn có các đối số hoán đổi. Thử đi:

zip -d gallery.zip "picture_43_9.jpg" 

Từ trang zip (1) man:

-d
--delete
Xóa (xóa) các mục từ một kho lưu trữ zip. Ví dụ:

zip  -d  foo  foo/tom/junk  foo/harry/\*  \*.o

sẽ xóa mục nhập foo/tom/junk, tất cả các tệp bắt đầu bằng foo/harry/và tất cả các tệp kết thúc bằng .o(trong bất kỳ đường dẫn nào). Lưu ý rằng việc mở rộng tên đường dẫn shell đã bị ức chế với dấu gạch chéo ngược, do đó zip có thể nhìn thấy dấu hoa thị, cho phép zip khớp với nội dung của kho lưu trữ zip thay vì nội dung của thư mục hiện tại. (Dấu gạch chéo ngược không được sử dụng trên các nền tảng dựa trên MSDOS.) Cũng có thể sử dụng dấu ngoặc kép để thoát dấu hoa thị như trong

zip -d foo foo/tom/junk "foo/harry/*" "*.o"

Không thoát khỏi các dấu sao trên một hệ thống mà trình bao mở rộng các ký tự đại diện có thể dẫn đến các dấu hoa thị được chuyển đổi thành một danh sách các tệp trong thư mục hiện tại và danh sách đó được sử dụng để xóa các mục từ kho lưu trữ.

Trong MSDOS, -d phân biệt chữ hoa chữ thường khi khớp với tên trong kho lưu trữ zip . Điều này yêu cầu tên tệp phải được nhập bằng chữ in hoa nếu chúng được nén bởi PKZIP trên hệ thống MSDOS. (Chúng tôi coi là làm cho trường hợp này không nhạy cảm trên hệ thống mà đường dẫn là trường hợp nhạy cảm, nhưng nó có thể lưu trữ đến từ một hệ thống mà trường hợp không thành vấn đề và các kho lưu trữ có thể bao gồm cả Barbar từng file riêng lẻ trong kho lưu trữ.) Nhưng thấy tùy chọn mới - ic để bỏ qua trường hợp trong kho lưu trữ.


Bạn nói đúng, cảm ơn, tôi đã bối rối bởi sự trợ giúp của dòng lệnh của zip zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo

@AlexFlo: Bạn có thể có một bản sao xấu của trang người đàn ông. Bản sao được trích dẫn ở trên nói rằng [[ zipfile [ file, ]], có nghĩa là bạn có thể có (a) không có đối số tên tệp nào (mặc dù tôi không biết làm thế nào có thể hợp lệ, trừ khi bạn đang yêu cầu trợ giúp ), (b) chỉ một tên zipfile (tệp lưu trữ) hoặc (c) một tên zipfile theo sau bởi một hoặc nhiều tên tệp thông thường. (Đây có thể là tên của các tệp thực tế được chèn vào kho lưu trữ hoặc tên của các thành viên lưu trữ sẽ bị thao túng.)
Scott

@AlexFlo - Bạn có thể chuyển các đối số tên tệp qua STDIN và đường ống tới zip, như đã nêu trong trang man mà bạn đã trích dẫn. Chẳng hạn, nếu bạn đang ở trong một thư mục chứa file1.txt, file2.txtfile3.txt, bạn có thể thực thi ls -1 | zip -q 'files.zip' -@, nó sẽ tạo ra kho lưu trữ files.zipchứa 3 tệp bạn đã lưu zipvới tên tệp của chúng còn nguyên vẹn.
rubynorails
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.