web-dev-qa-db-ja.com

Zipアーカイブ内の1つのファイルを更新する方法

古いファイルを削除して新しいファイルを追加し、それを元に戻すことなく、Zipファイル内のファイルを置き換えることは可能ですか?

理由は、Zipファイルが非常に大きく、Zipファイル内に1つのxmlがあり、それを時々更新する必要があるためです。 Zipの解凍と再解凍には長い時間がかかります。そのため、Zip内の1つのxmlをスクリプトで置き換えることができるようにしたいだけです。私はすでに持っているxmlの更新をチェックしています。

それで、解凍したり再圧縮したりせずに、1つのxmlを単に置き換えることができますか?

申し訳ありませんが、Zipコマンドを使用してそのようなことを行いますが、スクリプトは実際にAndroid電話用であり、Zipは残念ながら使用できないコマンドです。可能であればZipを確実に使用しましたが、droidのunzipのみを使用し、busyboxにtarがありますが、tarは必要なことを行いません

68
user577732

Zip(1) から:

既存のZipアーカイブの名前を指定すると、ZipはZipアーカイブ内の同じ名前のエントリを置き換えるか、新しい名前のエントリを追加します。

したがって、指定した.Zipファイル名が既存のアーカイブになることを除き、その1つのファイルのみを含む新しい.Zipファイルを通常作成するのと同じように、Zipコマンドを使用します。

51
PleaseStand

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/dirWEB-INFディレクトリを含むディレクトリへのパスです(このディレクトリにはweb.xmlが含まれます)。

63
cayhorstmann

以下を試してください:

Zip [zipfile] [file to update] 

例:

$ Zip test.Zip test/test.txt
updating: test/test.txt (stored 0%)
36
user738048

これは古い質問ですが、同じことをしたかったのです。 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アーカイブに追加します。

13
traditional

更新フラグを使用します:-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%)
10
Ethan Strider

次を使用できます:Zip -u file.Zip path/file_to_update

4

Zipファイルを更新する-fオプションもあります。 Zipの生成後に更新されたすべてのファイルを更新するために使用できます(Zipファイル内のツリー構造内の同じ場所にあると仮定します)。

ファイルの名前が/myfiles/myzip.Zipの場合、必要なことは

Zip -f /myfiles/myzip.Zip
1
gvrocha

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/
0
mzsolt

Zipアーカイブ構造の側面から-再圧縮せずにZipファイルを更新できます。置換する必要があるファイルより前のすべてのファイルをスキップし、更新したファイルと残りのファイルを配置するだけです。最後に、更新された中央のディレクトリ構造を配置する必要があります。ただし、ほとんどの一般的なツールでこれを作成できるとは思いません。

0