古いファイルを削除して新しいファイルを追加し、それを元に戻すことなく、Zipファイル内のファイルを置き換えることは可能ですか?
理由は、Zipファイルが非常に大きく、Zipファイル内に1つのxmlがあり、それを時々更新する必要があるためです。 Zipの解凍と再解凍には長い時間がかかります。そのため、Zip内の1つのxmlをスクリプトで置き換えることができるようにしたいだけです。私はすでに持っているxmlの更新をチェックしています。
それで、解凍したり再圧縮したりせずに、1つのxmlを単に置き換えることができますか?
申し訳ありませんが、Zipコマンドを使用してそのようなことを行いますが、スクリプトは実際にAndroid電話用であり、Zipは残念ながら使用できないコマンドです。可能であればZipを確実に使用しましたが、droidのunzipのみを使用し、busyboxにtarがありますが、tarは必要なことを行いません
Zip(1) から:
既存のZipアーカイブの名前を指定すると、ZipはZipアーカイブ内の同じ名前のエントリを置き換えるか、新しい名前のエントリを追加します。
したがって、指定した.Zipファイル名が既存のアーカイブになることを除き、その1つのファイルのみを含む新しい.Zipファイルを通常作成するのと同じように、Zip
コマンドを使用します。
LinuxのZip
ファイルは、Zip内の1つのファイルを置き換えるのが面倒であることがわかりました。 Java Development Kitのjar
ユーティリティは簡単かもしれません。JARファイル(Zipファイルのみ)でWEB/web.xml
を更新する一般的なタスクを考えてください。
jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml
ここで、path/to/dir
はWEB-INF
ディレクトリを含むディレクトリへのパスです(このディレクトリにはweb.xml
が含まれます)。
以下を試してください:
Zip [zipfile] [file to update]
例:
$ Zip test.Zip test/test.txt
updating: test/test.txt (stored 0%)
これは古い質問ですが、同じことをしたかったのです。 Zipアーカイブ内のファイルを更新します。そして、上記の答えのどれも本当に私を助けませんでした。
これが私がしたことです。一時ディレクトリabc
を作成しました。コピーされたfile.Zip
からabc
に移動し、そのディレクトリ内のファイルを抽出しました。編集したいファイルを編集しました。 abc
にいる間に、次のコマンドを実行しました
user@Host ~/temp/abc $ Zip -u file.Zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)
-u
スイッチは、変更された/新しいファイルを探し、Zipアーカイブに追加します。
更新フラグを使用します:-u
例:
Zip -ur existing.Zip myFolder
このコマンドは、myFolder
(およびその内容)を圧縮してexisting.Zip
に追加します。
高度な使用法:
更新フラグは、実際に着信ファイルを既存のファイルと比較し、新しいファイルを追加するか、既存のファイルを更新します。
したがって、Zipファイル内の特定のサブディレクトリを追加/更新する場合は、必要に応じてソースを更新し、-u
フラグを使用してソース全体を再圧縮します。変更されたファイルのみが圧縮されます。
ソースファイルにアクセスできない場合は、Zipファイルを解凍し、目的のファイルを更新してから、-u
フラグを使用して再圧縮することができます。繰り返しますが、変更されたファイルのみが圧縮されます。
例:
元のソース構造
ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│ ├── file3.txt
│ ├── Logs
│ │ ├── logs1.txt
│ │ ├── logs2.txt
│ │ ├── logs3.txt
更新されたソース構造
ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│ ├── file3.txt
│ ├── Logs
│ │ ├── logs1.txt
│ │ ├── logs2.txt
│ │ ├── logs3.txt
│ │ ├── logs4.txt <-- NEW FILE
使用法
$ Zip -ur existing.Zip ParentDir
> updating: ParentDir/ChildDir/Logs (stored 0%)
> adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)
次を使用できます:Zip -u file.Zip path/file_to_update
Zipファイルを更新する-fオプションもあります。 Zipの生成後に更新されたすべてのファイルを更新するために使用できます(Zipファイル内のツリー構造内の同じ場所にあると仮定します)。
ファイルの名前が/myfiles/myzip.Zipの場合、必要なことは
Zip -f /myfiles/myzip.Zip
7Zip
(7za)は、ファイル/ディレクトリを適切に追加/更新するために使用できます。
例:(ファイルの日付に関係なく)MANIFEST.MF
ファイルをJARファイルに入れます。 /source/META-INF
ディレクトリにはMANIFEST.MF
ファイルをjar
(Zip)に配置します:
7za a /tmp/file.jar /source/META-INF/
更新のみ(ソースが古い場合、ターゲットを置き換えません)
7za u /tmp/file.jar /source/META-INF/
Zipアーカイブ構造の側面から-再圧縮せずにZipファイルを更新できます。置換する必要があるファイルより前のすべてのファイルをスキップし、更新したファイルと残りのファイルを配置するだけです。最後に、更新された中央のディレクトリ構造を配置する必要があります。ただし、ほとんどの一般的なツールでこれを作成できるとは思いません。