Làm cách nào để kết hợp / hợp nhất các tập tin zip?


21

Trong vài tháng qua, tôi đã sao chép một số thư mục dữ liệu vào các tệp zip theo chu kỳ hàng tuần. Bây giờ tôi muốn kết hợp các tệp zip đó thành một tệp zip, vì hầu hết nội dung của các tệp zip hiện tại chỉ là các phiên bản khác nhau của cùng một tệp dữ liệu.

Vì vậy, nếu một tệp xuất hiện ở nhiều hơn một trong các tệp zip hiện có, tôi muốn phiên bản mới nhất nằm trong tệp zip mới được tạo. Tất nhiên nếu một tệp chỉ xuất hiện trong một tệp zip hiện có, thì tôi cũng muốn nó trong tệp zip cuối cùng.

Tôi đang cố gắng tránh phải giải nén từng cái một vào một thư mục đang hoạt động, ghi đè dữ liệu từ các tệp zip cũ bằng dữ liệu từ các tệp zip mới hơn, sau đó nén lại mọi thứ vào một tệp zip mới.

Từ những gì tôi hiểu, pkzip sẽ tự kết hợp các tệp zip, nhưng có một phương pháp miễn phí nhanh và đáng tin cậy mà ai cũng có thể cho tôi biết không?


1
zipmerge cho chiến thắng
Mã Bling

Câu trả lời:


7

bạn sẽ không thích nó nhưng: giải nén mọi thứ vào một thư mục làm việc theo đúng thứ tự, sau đó nén kết quả là cách hiệu quả nhất.

nếu không, bạn sẽ kết thúc với rất nhiều chu kỳ CPU bị lãng phí:

  • giả sử kết quả của bạn chuyển đến 'first.zip'
  • mọi tệp từ '2.zip', '3.zip', v.v ... phải được giải nén và sau đó được nén lại thành 'first.zip'
  • trong '2.zip' tồn tại một tệp 'foobar.txt' và trong '3.zip' tồn tại một tệp khác 'foobar.txt'. hợp nhất nó theo cách bạn muốn hợp nhất nó dẫn đến 'nén nó X lần'
  • mã thông báo của .zip nằm ở cuối tệp: bạn thêm nhiều nội dung (vào giữa
    .zip bằng cách cập nhật một tệp ở giữa) và toàn bộ tệp phải được ghi lại

vì vậy, imho chỉ cần sử dụng ' unzip ' Wiseley:

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

Thứ tự giải nén rất quan trọng, tôi không biết mẫu tên zip của bạn, nhưng trước tiên tôi sẽ trích xuất tệp zip mới nhất, tùy chọn '-u' của giải nén ghi đè lên các tệp nếu chúng mới hơn hoặc tạo tệp nếu không đã ở đó. do đó, bạn sẽ chỉ giải nén các tệp mới nhất và chỉ nén kết quả một lần.


Điều này có thể hiệu quả nhất từ ​​góc độ người dùng - nhưng nó không chính xác. Bảng tệp trong một zip thực tế là ở cuối, nhưng bạn có thể tùy ý ghi các tệp vào cuối của bất kỳ zip nào và sau đó viết một bảng tệp mới. Kỷ lục cuối cùng luôn chiến thắng. Những người có một chút quen thuộc với kịch bản hoặc lập trình có thể thực hiện toàn bộ quá trình này mà không cần giải nén hoặc nén bất kỳ tệp nào chỉ bằng cách di chuyển các khối nhị phân xung quanh và cập nhật bảng zip.
caesay

Trên thực tế, bạn chỉ có thể ghép tất cả các zip thành một tệp duy nhất (theo thứ tự bạn muốn) và sau đó viết một bản ghi tệp mới ở cuối để chỉ bao gồm các phiên bản mới nhất của tệp. Điều này có thêm lợi ích là zip vẫn chứa tất cả các phiên bản trước của tệp có thể được phục hồi nếu không cần thiết
caesay

"mọi tệp từ '2.zip', '3.zip', v.v. phải được giải nén và sau đó được nén lại thành 'first.zip'" là không chính xác. Các zipmergehòa trộn tiện ích ZIP lưu trữ mà không cần giải nén và tái nén, ví dụ.
ZachB

Tôi đã sử dụng unzipping/ zippingvà không uncompress / decompress. Vâng, rõ ràng người ta có thể lấy một mục của 2.zip(blob nén) và chuyển nó vào first.zipvà do đó không có "nén" phải diễn ra. Nhưng bạn phải trích xuất blob từ 2.zip, tra cứu sự tồn tại trong TOC của first.zip, nếu nó ở đó thay thế mục nhập hiện có (có nghĩa là bạn phải viết lại toàn bộ tệp về cơ bản) hoặc nối nó vào cuối - và sau đó bạn cần phải nối thêm mã vạch của zip. Tôi không thấy làm thế nào zipmergecó thể đạt được sự hợp nhất của các mục zip theo một cách khác (nén sang một bên)
akira

-1 bởi vì có nhiều cách hiệu quả hơn để thực hiện nhiệm vụ này và không có lời biện minh nào cho việc này là "cách hiệu quả nhất" có ý nghĩa nhỏ nhất. every file [...] has to be unzipped and then zipped again- không, đó là những gì giải pháp của bạn làm. in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'- không, không. Tại sao nó? you add more content [...] and the whole file has to be rewritten- không, bạn viết đầu ra trong một lần. Tại sao có ai nêu lên điều này?
benrg

4

Chỉ cần sử dụng tùy chọn -g của ZIP, nơi bạn có thể nối bất kỳ số lượng tệp ZIP nào vào một (mà không cần giải nén các tệp cũ). Điều này sẽ giúp bạn tiết kiệm thời gian đáng kể.

Cũng có một cái nhìn tại zipmerge


4
-gthêm tập tin vào một zip hiện có. nó không hợp nhất chúng. ví dụ: zip -g result.zip other.zipsẽ thêm tệp other.zipvào result.zip . --grow Grow (nối vào) kho lưu trữ zip được chỉ định, thay vì tạo tệp mới. Nếu thao tác này không thành công, zip sẽ cố gắng khôi phục kho lưu trữ về trạng thái ban đầu. Nếu khôi phục thất bại, kho lưu trữ có thể bị hỏng. Tùy chọn này bị bỏ qua khi không có kho lưu trữ hiện có hoặc khi ít nhất một thành viên lưu trữ phải được cập nhật hoặc xóa
akira



1

Tôi đã nghĩ rằng bạn có thể kịch bản các tập tin được trích xuất vào một thư mục tạm thời.

Có vấn đề với dòng lệnh này. Tôi không thể tìm cách ra lệnh giải nén tài liệu lưu trữ, vì vậy một kho lưu trữ cũ hơn có thể ghi đè lên một kho lưu trữ mới hơn. Vấn đề này có thể được khắc phục bằng cách sử dụng một unzipper, có một công tắc dòng lệnh để chỉ ghi đè nếu mới hơn. Tôi chủ yếu sử dụng 7-Zip không có tùy chọn dòng lệnh như vậy.

Ngoài ra, lệnh này cần trên tất cả các tệp zip nằm trong cùng một thư mục. Không phải là một vấn đề nếu tất cả các khóa có tên duy nhất. Điều đó nói rằng, lệnh có thể được thay đổi để phù hợp với tình huống của bạn.

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

Để thay đổi điều này để sử dụng một chương trình giải nén khác, chỉ cần thay thế "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoabằng bất kỳ lệnh nào bạn sẽ thực hiện trên mỗi tệp. Sử dụng %fnhư một trình giữ chỗ cho tên của tệp bạn muốn giải nén.

Tôi đã cố gắng tìm kiếm một ứng dụng được đánh bóng, miễn phí hoặc bằng cách khác và không thực sự tìm thấy một ứng dụng.

Hy vọng rằng điều này sẽ cung cấp cho bạn một khởi đầu tốt và WinZip hoặc một cái gì đó tương tự có thể giải quyết vấn đề ghi đè.

Chúc may mắn.


0

Nếu tôi nhớ chính xác, pkzip là một chương trình dòng lệnh.

Vẫn còn một phiên bản dòng lệnh của ZIP tuyên bố là tương thích với pkzip.

Nó được gọi là Info-ZIP và cần có một phiên bản cho HĐH của bạn.


Nó có chức năng tôi đang hỏi về? Tôi không thể tìm thấy nơi nó liệt kê khả năng này.
CChriss

1
Bộ Info-Zip làm cho các tệp tương thích với PKZip, nhưng bản thân các chương trình khác nhau và dường như không bao gồm tùy chọn hợp nhất.
CarlF

OK, xin lỗi, tôi đã có thể biên dịch và chạy Info-Zip trên máy trạm Apollo trong DOMAIN / OS nhiều năm trước. Tôi nhớ nó đã cung cấp các tính năng khác nhau trên DOS / VMS / Unix và một vài thứ khác, thậm chí sau đó. Tôi cho rằng nó có thể đã phát triển hơn nữa.
pavium

0

Tìm kiếm dòng lệnh winzip trên mạng. Winzip có một số phiên bản của các công cụ dòng lệnh để phù hợp với bất kỳ phiên bản winzip nào bạn có thể đã cài đặt. Công cụ dòng lệnh WZZIP có tùy chọn "làm mới" sẽ chỉ nén các tệp mới hơn của các tệp khớp với tên của tệp trong tệp zip đầu ra tổng hợp.

Sử dụng WZunzip được gói trong câu lệnh FOR như được hiển thị ở trên để giải nén một tệp vào thư mục sau đó WZzip -f để thêm các tệp đó vào tệp zip tổng kết đầu ra. Sau đó, vòng lặp FOR lặp lại để làm việc trên tệp đầu vào tiếp theo để xuất ra tệp đầu ra một và duy nhất. Thứ tự của các tệp đầu vào không quan trọng vì WZzip -f sẽ chỉ thêm vào tệp đầu ra nếu dữ liệu đầu vào mới hơn dữ liệu đã có trong tệp đầu ra. Tất cả các tệp không tồn tại trong tệp đầu ra cũng sẽ được thêm vào. Sau đó, bạn có thể giải nén kết quả vào một thư mục và sau đó nén lại để có được tệp kết quả được đóng gói hiệu quả. Bạn thậm chí có thể làm điều này tự động sau vòng lặp FOR ở cuối tệp bó.

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.