Cách cập nhật một tệp trong kho lưu trữ zip


86

Có thể thay thế một tệp trong tệp zip mà không cần giải nén xóa tệp cũ thêm tệp mới và giải nén lại không?

Lý do là tôi có một tệp zip rất lớn, có một xml bên trong tệp zip mà đôi khi tôi phải cập nhật. Việc giải nén zip và nén lại mất nhiều thời gian. Vì vậy, tôi muốn chỉ có thể thay thế một xml bên trong zip thông qua một tập lệnh. Tôi đã kiểm tra các bản cập nhật trên xml mà tôi có.

Vì vậy, có thể chỉ thay thế một xml mà không cần giải nén và nén lại không?

Xin lỗi, tôi sẽ sử dụng lệnh zip để làm những việc như vậy nhưng vấn đề là tập lệnh thực sự dành cho điện thoại Android và zip không phải là lệnh tôi có thể sử dụng. Rất tiếc, tôi đã bỏ qua. Tôi sẽ sử dụng zip chắc chắn nếu tôi có thể nhưng tôi chỉ có giải nén cho droid và sau đó có tar trong hộp thư bận nhưng tar không làm những gì tôi cần


3
bạn có thể thay đổi tiêu đề câu hỏi thành một cái gì đó có ý nghĩa hơn không?
tokland

7
Ngoài ra, câu hỏi có thể là một hoặc hai câu. Khoảng 80% là lan man.
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


62

Từ mã zip (1) :

Khi được cung cấp tên của kho lưu trữ zip hiện có, zip sẽ thay thế các mục nhập có tên giống hệt nhau trong lưu trữ zip hoặc thêm các mục nhập cho tên mới.

Vì vậy, chỉ cần sử dụng ziplệnh như bạn thường làm để tạo tệp .zip mới chỉ chứa một tệp đó, ngoại trừ tên tệp .zip mà bạn chỉ định sẽ là tệp lưu trữ hiện có.


5
Ai đó có thể cho một ví dụ, xin vui lòng? Tôi không hiểu sự trợ giúp của lệnh zip.
Gustave,

12
Giả sử bạn đã nén myfolder bằng cách sử dụng zip -r myfolder.zip myfoldernếu bạn muốn cập nhật myfolder/otherfolder/myfile.txt, hãy tiếp tục chỉnh sửa tệp và chạyzip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas

1
Làm thế nào để làm điều đó nếu tệp cần thay thế không có cùng tên hoặc cùng cấu trúc với tệp được thay thế?
Fractaliste

2
@Fractaliste Bạn phải làm cho nó có tên và cấu trúc tương tự;)
Hack5

72

Tôi thấy ziptệp Linux cồng kềnh để thay thế một tệp duy nhất trong một tệp zip. Các jartiện ích từ Java Development Kit có thể được dễ dàng hơn. Hãy xem xét nhiệm vụ phổ biến của việc cập nhật WEB/web.xmltrong tệp JAR (chỉ là tệp zip):

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

Đây, path/to/dirlà đường dẫn đến một thư mục chứa WEB-INFthư mục (đến lượt nó chứa web.xml).


điều gì sẽ xảy ra nếu tôi chỉ sao chép tệp thay vì tạo giám đốc WEB-INFcó tệp đó.
Giúp tay vào

Cũng trong trường hợp của tôi, chiếc "jar" cũ thân yêu đã thực hiện một mẹo nhỏ! Cảm ơn!
bitfox

51

Hãy thử những cách sau:

zip [zipfile] [file to update] 

Một ví dụ:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)

2
Đây là cái dễ hiểu nhất nhờ vào ví dụ, cảm ơn!
vatsug

2
Hãy tính đến điều bạn sẽ thấy updating:thay vì adding:bạn muốn cập nhật tệp bên trong zip; nếu không, bạn đang thêm tệp vào zip chứ không phải thay thế nó.
Edenshaw

Bạn nói đúng, tôi đã không nhận thấy điều đó. Đã cập nhật, cảm ơn!
WizardsOfWor

13

Tôi biết đây là câu hỏi cũ, nhưng tôi cũng muốn làm như vậy. Cập nhật tệp trong kho lưu trữ zip. Và không có câu trả lời nào ở trên thực sự giúp ích cho tôi.

Đây là những gì tôi đã làm. Đã tạo thư mục tạm thời abc. Sao chép file.zipđến abcvà trích xuất các tập tin trong thư mục đó. Tôi đã chỉnh sửa tệp mà tôi muốn chỉnh sửa. Sau đó, trong khi ở trong abc, chạy lệnh sau

user@host ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u switch sẽ tìm kiếm các tệp đã thay đổi / mới và sẽ thêm vào kho lưu trữ zip.


11

Sử dụng cờ cập nhật: -u

Thí dụ:

zip -ur existing.zip myFolder

Lệnh này sẽ nén và thêm myFolder(và nội dung của nó) vào existing.zip.


Sử dụng nâng cao:

Cờ cập nhật thực sự so sánh các tệp đến với các tệp hiện có và sẽ thêm các tệp mới hoặc cập nhật các tệp hiện có.

Do đó, nếu bạn muốn thêm / cập nhật một thư mục con cụ thể trong tệp zip, chỉ cần cập nhật nguồn như mong muốn, sau đó nén lại toàn bộ nguồn bằng -ucờ. Chỉ các tệp đã thay đổi sẽ được nén.

Nếu bạn không có quyền truy cập vào các tệp nguồn, bạn có thể giải nén tệp zip, sau đó cập nhật các tệp mong muốn và sau đó nén lại bằng -ucờ. Một lần nữa, chỉ các tệp đã thay đổi sẽ được nén.

Thí dụ:

Cấu trúc nguồn gốc


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

Cấu trúc nguồn cập nhật


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├── logs4.txt <-- NEW FILE 

Sử dụng

$ zip -ur existing.zip ParentDir 
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)


1

Ngoài ra còn có tùy chọn -f sẽ làm mới tệp zip. Nó có thể được sử dụng để cập nhật TẤT CẢ các tệp đã được cập nhật kể từ khi tệp zip được tạo (giả sử chúng ở cùng một vị trí trong cấu trúc cây trong tệp zip).

Nếu tệp của bạn có tên /myfiles/myzip.zip, tất cả những gì bạn phải làm là

zip -f /myfiles/myzip.zip

0

Từ phía cấu trúc lưu trữ ZIP - bạn có thể cập nhật tệp zip mà không cần giải nén lại, bạn sẽ chỉ cần bỏ qua tất cả các tệp có trước tệp bạn cần thay thế, sau đó đặt tệp đã cập nhật của bạn và sau đó là các tệp còn lại. Và cuối cùng, bạn sẽ cần đặt cấu trúc thư mục trung tâm được cập nhật. Tuy nhiên, tôi nghi ngờ rằng hầu hết các công cụ phổ biến sẽ cho phép bạn thực hiện điều này.


0

7zip (7za) có thể được sử dụng để thêm / cập nhật tệp / thư mục một cách độc đáo:

Ví dụ: Thay thế (bất kể ngày tệp) MANIFEST.MFtệp trong tệp JAR. Thư mục /source/META-INFchứa MANIFEST.MFtệp mà bạn muốn đưa vào jar(zip):

7za a /tmp/file.jar /source/META-INF/

Chỉ cập nhật (không thay thế đích nếu nguồn cũ hơn)

7za u /tmp/file.jar /source/META-INF/

-2

Vâng nó có thể.

trên hệ thống dựa trên linux chỉ cần cài đặt zip và bạn có thể gọi nó trong dòng lệnh. hãy xem manpage: http://linux.die.net/man/1/zip

nhưng theo kinh nghiệm cá nhân của tôi, nếu có thể và việc nén không quá quan trọng, điều này hoạt động tốt hơn với các tệp tar đơn giản và tar.

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.