プロが教える店舗&オフィスのセキュリティ対策術

Windows版のgzipについて

os:win xp-pro

gzip「http://www.gzip.org/」 windows版で
標準入力からの情報を圧縮しようとするとおかしくなります。

以前にpostgresからのダンプ圧縮としてマニュアルに載っているコマンド(linux用)をWindowsでも出来ないかと質問させて頂いたところ、
gzipのWindows版を紹介して頂きました。


<ダンプ圧縮コマンド>
pg_dump dbname | gzip > filename.gz


<試行1>
Windows版のgzipをインストール後、試してみました。
pg_dump.exe --host=localhost --username=postgres template1 | gzip.exe > C:?Temp?test_dump.gz
しかし、C:?Temp?test_dump.gzを解凍できません。
一旦、テキストで出した後、改めて圧縮すると解凍できます。
pg_dump.exe --host=localhost --username=postgres template1 > C:?Temp?test_dump
gzip.exe C:?Temp?test_dump


<試行2>
一旦、postgresの事は忘れて、適当なテキストファイルを用意し、標準入力から圧縮しました。

type c:?temp?test.txt | gzip.exe > c:?temp?test.txt.gz

結果は、やはり解凍できません。

シンプルに圧縮してみました。
gzip.exe c:?temp?test.txt

c:?temp?test.txt.gzを解凍する事ができました。



どうしたものでしょうか?
何かやり方が悪いのでしょうか?

A 回答 (3件)

こちらでは、まったく再現しません。

正常に動作しています。

正直、どうなってるかわかりません。
・type c:\temp\test.txt | gzip.exe > c:\temp\test.txt.gz
としたときの test.txt.gzをバイナリエディタで開いてみたり、 linuxにバイナリ転送→fileコマンドで識別してみたりして、どんな出力になっているかを確認する。
・CygwinやMinGWを使ってみる

位しか思いつきません。

・実験環境
XP SP3 32bit
PATH=C:\WINDOWS;C:\WINDOWS\SYSTEM32
として、なるべく他の影響を遮断

・実験内容
gzip -v9 ファイル (ファイルを置き換える)
gzip -v9c ファイル > ファイル.gz (入力指定、標準出力へ)
gzip -v9c < ファイル > ファイル.gz (標準入力から、標準出力へ)
type ファイル | gzip -v9c > ファイル.gz (パイプから入力)
の4つを実行。gzipはフルパスで指定。
ファイルにはgzip for Windwos 1.3.12のChangelog(テキスト)とgzip.exe(バイナリ)をリネームして使用
-l,-tオプションでの確認と、Cygwinのgzipを使用しての伸長後との比較
→すべての条件で-l,-t問題なし。伸長後も圧縮前と一致。

念の為、1.2.4, 1.3.12両方でやってみましたが、同じ結果でした。
    • good
    • 0
この回答へのお礼

「こちらでは、まったく再現しません。正常に動作しています。」という回答に、もしやと思い、cmd.exeを起動し、そこから実行しました。
すると、うまくいきました。

書き忘れていましたが、Windows PowerShellから実行していました。

Windows PowerShellから・・・NG
コマンドプロンプトから・・・OK

という結果です。

type c:\temp\test.txt | gzip.exe > c:\temp\test.txt.gz
をtest.batに保存し、
PowerShellからtest.batを実行すると正しく動作しました。

gzipというよりPowerShellの問題のようです。

わざわざ検証していただき、本当にありがとうございます。

お礼日時:2010/06/10 11:01

Unix 環境の cat 相当の処理をしたいのだと思いますが、


type は cat ではないのでバイナリファイルをうまく扱えず、
結果としてパイプを通して gzip に渡せていないように思います。

対策としては cat を使えるように cygwin や msys 環境を作るか、
単独で cat 相当のコマンドを導入することになります。

パイプに拘るのであれば、cygwin か msys を導入するのを提案します。
    • good
    • 0
この回答へのお礼

ありがとうございます。
PowerShellから起動したのが悪かったようです。

お礼日時:2010/06/10 11:05

標準出力へ出力する -c オプションと、標準入力から入力を表わす - を付けたらどうなりますか?


type c:\temp\test.txt | gzip.exe -c - > c:\temp\test.txt.gz

この回答への補足

だめです。
同じ事になります。

gzip test.txt というシンプルな使いかた以外では全く成功しません。

ちなみに成功した場合は正しく解凍できますが、圧縮に失敗した場合、
test.txt.gz: not in gzip format
となります。

左から入れられないなら、windowsにわざわざgzipを入れる意味が無いですし、どうしたものかという感じです。

補足日時:2010/06/08 09:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!