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


88

古いファイルを解凍して削除し、新しいファイルを追加して再圧縮せずに、zipファイル内のファイルを置き換えることは可能ですか?

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

それで、解凍して再解凍せずに1つのxmlを置き換えることは可能ですか?

申し訳ありませんが、zipコマンドを使用してそのようなことを行いますが、問題は、スクリプトが実際にはAndroidスマートフォン用であり、zipは使用できるコマンドではないことです。残念ながら、それを省略しました。できれば間違いなくzipを使用していましたが、droidの解凍しかなく、busyboxにtarがありますが、tarは必要なことを実行しません


3
質問のタイトルをもっと意味のあるものに変更できますか?
tokland 2011年

7
また、質問は1つか2つの文であった可能性があります。その約80%はとりとめのないものです。
デニスウィリアムソン

回答:


63

以下からのジッパー(1)

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

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


5
誰かが例を挙げてもらえますか?zipコマンドのヘルプがわかりません。
ギュスターブ

12
zip -r myfolder.zip myfolder更新したい場合は、myfolderを使用して圧縮しmyfolder/otherfolder/myfile.txt、ファイルを編集して実行するとしますzip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas 2016年

1
置き換えるファイルの名前も構造も、再配置するファイルと同じでない場合はどうすればよいですか?
fractaliste 2017

2
@Fractaliste同じ名前と構造にする必要があります;)
Hack5 2017年

75

Linuxzipファイルは、zip内の単一のファイルを置き換えるのが面倒であることがわかりました。jarJava DevelopmentKitのユーティリティの方が簡単な場合があります。WEB/web.xmlJARファイル(単なるzipファイル)で更新する一般的なタスクについて考えてみます。

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

ここpath/to/dirに、ディレクトリを含むディレクトリへのパスがありますWEB-INF(ディレクトリにはweb.xml)が含まれています。


WEB-INFそのファイルを持つダイレクタを作成する代わりに、ファイルのみをコピーする必要がある場合はどうなりますか。
救いの手

また、私の場合、親愛なる古い「jar」utilがトリックを行いました!ありがとう!
bitfox

52

次のことを試してください。

zip [zipfile] [file to update] 

例:

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

2
これは、例のおかげで最も理解しやすいものです、ありがとう!
vatsug 2017年

2
zip内のファイルを更新する場合ではupdating:なく、表示する必要があることを考慮してくださいadding:。それ以外の場合は、ファイルをzipに置き換えるのではなく、zipに追加します。
Edenshaw

あなたが正しい、私はそれに気づかなかった。更新されました、ありがとう!
WizardsOfWor

13

これは古い質問ですが、同じことをしたかったのです。zipアーカイブ内のファイルを更新します。そして、上記の答えのどれも私を本当に助けませんでした。

これが私がしたことです。一時ディレクトリを作成しましたabc。コピーfile.zipabcそのディレクトリ内のファイルをして抽出しました。編集したいファイルを編集しました。次に、にいる間にabc、次のコマンドを実行しました

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

-u スイッチは変更された/新しいファイルを探し、zipアーカイブに追加します。


12

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


1

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

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

zip -f /myfiles/myzip.zip

0

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


0

7zip (7za)は、ファイル/ディレクトリを適切に追加/更新するために使用できます。

例:( ファイルの日付に関係なく)MANIFEST.MFJARファイル内のファイルを置き換える。/source/META-INFディレクトリが含まれているMANIFEST.MFあなたに入れたいというファイルjar(ZIP)を:

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

更新のみ(ソースが古い場合はターゲットを置き換えません)

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

-2

はい、その可能性があります。

Linuxベースのシステムでは、zipをインストールするだけで、コマンドラインで呼び出すことができます。マンページをご覧くださいhttp//linux.die.net/man/1/zip

しかし、私の個人的な経験では、可能であれば圧縮はそれほど重要ではありませんが、これはプレーンなtarファイルとtarでより適切に機能します。

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