質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

2回答

5700閲覧

linuxのzipコマンドで、毎回zipの容量が変わります

退会済みユーザー

退会済みユーザー

総合スコア0

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2016/08/25 08:20

###前提・実現したいこと

phpで「特定ディレクトリ下のファイル全てを再帰的にzip化し、win/mac共に正常解凍・ソフト起動できるzipを生成する」処理を実装しています。

phpからexecでzipコマンドを実行してファイル群の入ったディレクトリを圧縮していますが、その中の各OS用の実行ファイルが、windowsでは起動できますが、macでは起動できないため調べたところ、圧縮する度に、毎回zipの容量が異なっていることがわかりました。

これは、linuxのZIP圧縮の正常動作なのでしょうか?
(winで圧縮・解凍すると正常動作します)

zip圧縮さえ正しくできれば、問題が解決しそうなのですが・・・。

###発生している問題・エラーメッセージ

・zipコマンドでzip化すると、毎回zipの容量が異なる。解凍後の中身の一部ファイルの容量も異なる。
・zip化前のファイル群のハッシュ値と、zip化後に解凍したファイル群のハッシュ値は一部異なっていました(ファイル破損?)
・Mac(OS X EI)では解凍後にソフトを実行すると「アプリケーション XX を開けません。」とエラーが出ます。
・Winでは動作します。
・各OS共に、zip化前のファイル群は正常動作します。

###試したこと
・zipコマンドで毎回zipの容量が違う問題が解決できないため、phpのzipArchiveを使ったところ、zipが破損していてmacでは解凍さえできませんでした。(winは解凍可)

###補足情報
・容量が100メガ前後あるため、phpのmemory_limitは大きくしています。
・output_compressionをoffにしています。
・コマンドは zip -r file.zip dir です。 -rXも試しました。phpじゃなくコンソールから叩いても同じでした。
・CentOS6.8、ZIP3.0です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

解凍したファイルのハッシュ値が異なるという所から、正常にzipファイルが作成できていないと思われます。Win用とMac用ではアプリ本体が異なると思いますが、Win用の部分は正常にできていて、Mac用の部分あたりから壊れているのではないかと思われます。次を確認してみてください。

  • ファイル名に日本語が使われている。

zipはファイル名のエンコードについて決まりが無いため、WinとMacで使用するエンコードが異なります。もし、日本語のファイル名が使われているようであれば、全てASCII(英数字)にしてみてください。

  • zipのコマンドが正常に終わっていない。

時間がかかりすぎてのタイムアウトなどで正常に終わっていない可能性があります。execが終わった後、正常終了の終了コードを返しているか確認してください。

  • zipコマンドの途中でダウンロードしてしまっている。

実際のコードがどうなっているかわかりませんが、zip化とダウンロードの処理が別の場合、zip化が完了する前にzipファイルのダウンロードが始まっていませんでしょうか?その場合は中途半端なzipを返してしまって、終わり際のファイルが壊れることになります。

  • zipコマンド自体がぶっ壊れている。

PHPを介さずに手動でzipコマンドを実行し、それでできたzipファイルがどうなるかを確認してみてください。もし、そのzipファイルすらおかしいのであれば、zipコマンド自体がおかしいと思われます。違うzipコマンドを試せそうであれば、そちらを試して見てください。

  • zipコマンドが走っている途中で、フォルダの中身が変わっている。

無いとは思いますが、途中でフォルダの中身に変化があると正常に圧縮できません。そのような動作をしていないかを確認してみてください。

投稿2016/08/25 12:23

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/26 05:37

どうもありがとうございます。 日本語ファイルは無く、execのphpスクリプトが終了後にDLしてます。 順にいろいろ試しているうちに、zipする前に、一度作業ディレクトリにコピーして、そこで cd xxx; zip -r xxx; としているため、コピー時に問題がある可能性がわかりました。 コピーせずにコマンドラインから圧縮用ディレクトリを直接 zip したり、phpでも何度もzip化をやり続けていると何故か容量が落ち着いて一定の数値になりました。 容量が変わる原因は、なんとなくつかめました。ありがとうございます。 容量変化の有無に関わらず、Macではソフトが動作しないのですが、こちらも「Macで解凍した場合」に動かないので、パーミッションか何かなのかなと推測して試してますが、まだ上手く解決できていません。 問題の切り分けのため、別質問にしたほうが良いような気もします。 どうもありがとうございます。
guest

0

Zip圧縮する時のコマンドオプションが
毎回微妙に違うのではないでしょうか?

それにより例えば改行コードが認識
されたりされなかったりして元の
ファイルが同じでも容量が異なること
になります。

That's all!!

投稿2016/08/25 10:29

Yatsurugi

総合スコア1628

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/26 04:28

どうもありがとうございます。 オプションは毎回 -r または -rX のみでテストしていますが、同じオプションでも変わりました。 今試していると、コンソールでは容量は変わらず、php経由だと変わることがわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問