元のファイルを保持するようにgzipに指示する方法は?


210

元のファイルを保持しまま、gzipコマンドラインツールを使用してテキストファイルを圧縮したいと思います。デフォルトでは、次のコマンドを実行します

gzip file.txt

このファイルを変更し、名前を変更しfile.txt.gzます。この振る舞いの代わりに、私は既存のものに加えてこの新しい圧縮ファイルを持ちたいfile.txtです。今のところ、私はそれを行うために次のコマンドを使用しています

gzip -c file.txt > file.txt.gz

それは動作しますが、なぜこのような一般的なタスクを実行する簡単な解決策がないのだろうか?たぶん私はそれをするオプションを見逃したのですか?


3
これは、gzipが指定されたファイルを圧縮し、新しいファイルを作成するためです。圧縮とは、元のファイルを圧縮して新しいファイルに置き換えることです。「-c」オプションは、gzipに他の名前で保存するように明示的に指示しています。それが機能する理由です
-SHW

@SHW私はあなたのコメントを取得できませんでした... ...
マヌエルセルバ

@ManuelSelvaは、元のファイルが圧縮されると、不要になります。これが設計だったと思います。
デイジー

2
なぜ、GZIP / gunzipはこれを行うデフォルトでたときには他のUNIXツールは、これがない私を超えていません。
Mateen Ulhaq

回答:


247

GNU gzip1.6以降、FreeBSDおよび派生物、またはNetBSDの最新バージョンについては、don_cristiの回答を参照してください。

どのバージョンでも、次のようにシェルリダイレクトを使用できます。

gzip < file > file.gz

引数が指定されていない場合gzip、標準入力を読み取り、圧縮して、圧縮バージョンを標準出力に書き込みます。おまけとして、シェルリダイレクトを使用する場合、呼び出されるファイル"--help""-"(まだ後者のファイルが問題であるgzip -c --)を心配する必要はありません。

別の利点gzip -c file > file.gzは、file開くことができない場合、空を作成せずにfile.gz(または既存のを上書きせずに)コマンドが失敗し、まったくfile.gz実行さgzipれないことです。

と比較した場合の大きな違いgzip -kは、fileのメタデータ(所有権、権限、変更時間、非圧縮ファイルの名前)をにコピーしようとしないことfile.gzです。

また、file.gzすでに存在している場合noclobber、シェルでオプションをオンにしない限り(set -o noclobberたとえばPOSIXシェルで)、静かにオーバーライドします。


4
これで、OPの質問の詳細に対処し、「gzipに元のファイルを保持するよう指示する方法」という一般的な質問に回答します。非常に便利で、より便利です-c
codewaggle

8
なお、<と>実際にコマンドに入力されるようになっていると、ファイル名のプレースホルダを表していない
のGauravグプタを

-kのオプションは?マニュアルページで見つけることができませんでした。たとえば、このバージョンはlinux.die.net/man/1/gzipです。また、gzipはデフォルトでファイルのメタデータをコピーするように見えます。
flow2k

1
@ flow2k、それはdon_cristiの答えへのリンクです。
ステファンシャゼラス

ああ、macosで表示されますが、RHELやUbuntuでは表示されません。ありがとう。
flow2k

138

最近(2013年6月)リリースされた「xz、lzip、bzip2などのツールとの一貫性のために--keep(-k)オプションを受け入れます。このオプションにより、gzipは圧縮または解凍時に名前付き入力ファイルを削除しません」gzip-1.6

manページからの抜粋:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

そのため、の時点で1.6-kまたは--keepを使用して元のファイルを保持できます。

gzip -k -- "$file"

$fileisの場合は機能しないことに注意してください-(これは、実際に呼び出されるファイルではなく、stdingzipを意味すると解釈されます)。その場合、それをに変更する必要があります)-./-

このオプションは、との一貫性のために(2007年のFreeBSD 7.0の)FreeBSD実装で最初に導入されましたgzipbzip2。これgzipgzip、NetBSD によるGNUの書き直しに基づいています。この-kオプションは最終的に2010年にNetBSDに戻りました


10
もう。RHEL6は...ベースにジップ1.3.12が付属しています
ニコラス・トーリーコットレル

これはMac / OS Xで動作します:)(BSDです)
ポール

1.6以上を使用していない多くの標準ディストリビューションはありますか?答えが更新される必要があるか
どうか疑問に思う

「-」とは何ですか?gzip -k "file"はうまく機能すると思います。
notilas


30

ドキュメントから、ファイルのコピーを作成するオプションはないようです。

シェル関数を定義できます

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

その後

gzipkeep file.txt

2
ファイルがの場合、-として呼び出す必要があることに注意してくださいgzipkeep ./-
ステファンシャゼル14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.