zipファイルを結合/マージする方法は?


21

過去数ヶ月間、週ごとに複数のデータフォルダーをzipファイルにコピーしました。既存のzipファイルのほとんどの内容は同じデータファイルの異なるバージョンであるため、これらのzipファイルを1つのzipファイルに結合したいと思います。

そのため、既存のzipファイルの1つ以上にファイルが表示される場合、作成される新しいzipファイルに最新バージョンを含めたいと思います。もちろん、ファイルが1つの既存のzipファイルにしか表示されない場合は、最終的なzipファイルにも含める必要があります。

私はそれらを1つずつ作業フォルダに解凍し、古いzipファイルのデータを新しいzipファイルのデータで上書きしてから、すべてを新しいzipファイルに再圧縮することを避けようとしています。

私が理解していることから、pkzipはzipファイル自体を結合しますが、誰にでも言える信頼できる高速な無料の方法はありますか?


1
勝利のためのzipmerge
コードブリン

回答:


7

気に入らないかもしれませんが、すべてを適切な順序で作業フォルダーに解凍してから、結果を圧縮することが最も効果的な方法です。

そうしないと、多くの無駄なCPUサイクルが発生します。

  • 結果が「first.zip」になると仮定します
  • 「2.zip」、「3.zip」などのすべてのファイルを解凍してから、「first.zip」に再度圧縮する必要があります
  • 「2.zip」にはファイル「foobar.txt」が存在し、「3.zip」には別のファイル「foobar.txt」が存在します。マージしたい方法でマージすると、「X回圧縮する」ことになります
  • .zipの目次はファイルの最後にあります。コンテンツを追加し(中央の
    ファイルを更新して.zipの中央に)、ファイル全体を書き換える必要があります。

そのため、imhoは単に ' unzip ' wiseleyを使用します。

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

解凍の順序は重要です。zip名のパターンはわかりませんが、最初に最新のzipファイルを抽出します。解凍の「-u」オプションは、新しい場合はファイルのみを上書きし、そうでない場合はファイルを作成しますもう着いている。その結果、最新のファイルのみを解凍し、結果を1回だけ圧縮します。


これはユーザーの観点から最も効果的かもしれませんが、正確ではありません。実際、zip内のファイルテーブルは最後にありますが、zipの最後にファイルを任意に書き込んでから、新しいファイルテーブルを書き込むことができます。最後のレコードが常に勝ちます。スクリプトまたはプログラミングに少し精通している人は、バイナリチャンクを移動してzipテーブルを更新するだけで、ファイルをまったく圧縮または圧縮せずにこのプロセス全体を実行できます。
caesay

実際、すべてのzipを(必要な順序で)1つのファイルに連結し、最後に新しいファイルレコードを書き込んで、ファイルの最新バージョンのみを含めることができます。これには、必要に応じて復元できるファイルの以前のバージョンがすべてzipに含まれているという追加の利点があります
-caesay

「「2.zip」、「3.zip」などのすべてのファイルを解凍してから、「first.zip」に再度圧縮する必要があります」は正しくありません。このzipmergeユーティリティは、たとえば、解凍および再圧縮せずにZIPアーカイブをマージします。
ZachB

私が使用unzipping/ zipping及びませんuncompress / decompress。はい、明らかに2.zip(圧縮BLOB)のエントリを1つ取得して転送first.zipできるため、「圧縮」を行う必要はありません。ただし、既存のエントリを置き換える(つまり、基本的にファイル全体を書き換える必要がある)場合2.zipfirst.zip、BLOBを抽出し、TOCの存在を検索する か、末尾に追加する必要があります。 zipのtocを追加します。私はどのように見てはいけないzipmerge(余談圧縮)、異なる方法でジップエントリーのマージを達成することができます
アキラ

-1。このタスクを実行するためのはるかに効率的な方法があり、これが「最も効果的な方法」であることを正当化する理由はほとんどありません。every file [...] has to be unzipped and then zipped again-いいえ、それはあなたのソリューションが行うことです。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'-いいえ、そうではありません。なぜだろうか?you add more content [...] and the whole file has to be rewritten-いいえ、1回のパスで出力を書き込みます。なぜこれを支持したのですか?
benrg

4

ZIPの-gオプションを使用するだけで、任意の数のZIPファイルを1つに追加できます(古いものを抽出せずに)。これにより、時間を大幅に節約できます。

また、見ていzipmergeを


4
-g既存のzipにファイルを追加します。それらはマージされません。例:zip -g result.zip other.zipファイルother.zipをresult.zipに追加します--grow . 新しいアーカイブを作成する代わりに、指定したzipアーカイブを成長(追加)します。この操作が失敗した場合、zipはアーカイブを元の状態に復元しようとします。復元に失敗すると、アーカイブが破損する可能性があります。既存のアーカイブがない場合、または少なくとも1つのアーカイブメンバーを更新または削除する必要がある場合、このオプションは無視されます。`
akira



1

一時ディレクトリに抽出されるファイルをスクリプト化できると考えていました。

このコマンドラインに問題があります。アーカイブの解凍を注文する方法が見つからなかったため、古いアーカイブが新しい​​アーカイブを上書きする可能性があります。この問題は、新しい場合にのみ上書きするコマンドラインスイッチを備えたジッパーを使用することで克服できます。私は主に、このようなコマンドラインオプションのない7-Zipを使用します。

また、このコマンドは、同じディレクトリにあるすべてのzipファイルで必要です。すべてのzipの名前が一意であれば問題ありません。ただし、コマンドは状況に合わせて変更できます。

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

これを変更して別の解凍プログラムを使用"c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoaするには、各ファイルで実行するコマンドに置き換えます。%f解凍するファイルの名前のプレースホルダーとして使用します。

無料またはそれ以外の洗練されたアプリを探してみましたが、実際には見つかりませんでした。

うまくいけば、これで良いスタートが切れ、WinZipまたは同様のものが上書きの問題を処理できることを願っています。

幸運を。


0

私の記憶が正しければ、pkzipはコマンドラインプログラムでした。

pkzipと互換性があると主張するZIPのコマンドラインバージョンがまだあります。

Info-ZIPと呼ばれ、OSのバージョンが必要です。


それは私が尋ねている機能を持っていますか?この機能がどこにリストされているかわかりません。
CChriss

1
Info-ZipスイートはファイルをPKZipと互換性がありますが、プログラム自体は異なり、マージオプションが含まれていないようです。
CarlF

申し訳ありませんが、何年も前にDOMAIN / OSのApolloワークステーションでInfo-Zipをコンパイルして実行することができました。DOS / VMS / Unixと他のいくつかの異なる機能を提供していたことを思い出します。さらに進化したのではないかと思います。
パビウム

0

ネット上でwinzipコマンドラインを探します。Winzipには、インストールしたwinzipのバージョンに合わせて、コマンドラインツールのいくつかのバージョンがあります。コマンドラインツールWZZIPには、合計出力zipファイル内のファイルの名前と一致するファイルのみの新しいファイルを圧縮する-f "freshen"オプションがあります。

上記のようにFORステートメントでラップされたWZunzipを使用して1つのファイルをディレクトリーに解凍し、次にWZzip -fを使用してそれらのファイルを出力合計zipファイルに追加します。次に、FORループが繰り返されて、次の入力ファイルで作業を行い、唯一の合計出力ファイルに出力します。WZzip -fは、入力データが既に出力ファイルにあるものよりも新しい場合にのみ出力ファイルに追加されるため、入力ファイルの順序は重要ではありません。出力ファイルに存在しないすべてのファイルも追加されます。次に、結果をフォルダーに解凍し、再度圧縮して、効率的に圧縮された結果ファイルを取得します。バッチファイルの最後のFORループの後に、これを自動的に行うこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.