.gzファイル拡張子なしでgzipファイルを作成する方法は?


14

元のファイル名を保持するgzip圧縮ファイルを作成したいと思います。たとえば、「example.txt」をgzippingすると、「example.txt.gz」ではなく「example.txt」という名前のgzip圧縮ファイルが出力されます。1つのコマンドでこれをエレガントに行うことは可能mvですか?


4
私は少し興味があります。なぜこれが欲しいのですか?それは悪い考えのように聞こえます。
ベルンハルト

3
うん。bashスクリプトに2行全体を入れて、「my-elegant-command」と呼びます。;)
goldilocks

2
@Bernhardこれは、Webアプリの継続的な統合ビルドプロセスの一部です。静的アセット(CSS、JSファイル)は、ファイル名を変更せずに圧縮する必要があります。ブラウザに配信されると、「content-encoding:gzip」ヘッダーが含まれるため、拡張子は関係ありません。しかし、ファイル名が変更された場合、ソースHTMLファイルで検索と置換を行う必要があります。
ジャミエブ

これが本当にあなたにとって大きな問題であれば、$ *をgzip実行可能ファイルに渡し、2行目でmvを実行するbash関数を定義できます。
ブラッチリー

4
@あなたのウェブアプリの問題:適当なウェブサーバーはあなたのために圧縮をすることができます/します...
バナンイン

回答:


12

これは動作しません:

# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>

これは競合状態です。

# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt 
Hello World # may also be empty

問題は、他のプロセスがファイルを読み取る前に> example.txt(またはdd of=example.txtそのことに関して)ファイルを強制終了することです。したがって、明らかな解決策はありません。そのため、に固執する必要がありmvます。

チートできる方法はいくつかあります。ファイルを開いて、リンクを解除することができます-ファイルは、閉じるまで存在し続けます-そして、同じ名前で新しいファイルを作成し、そこにgzip圧縮されたデータを書き込みます。ただし、bashにそれを使用するように強制する明白な方法はわかりません。

それさえしないでください。

gzip何らかの理由で失敗した場合、またはgzip中にスペースが足りなくなったなどの問題が発生した場合(他のプロセスが書き込みを行っているか、gzipの結果が入力よりも大きいため(ランダムデータの場合など))、ファイルが失われました。おめでとう!

別のファイルを作成し、mv成功した場合。これは、最も簡単で理解しやすく、最も信頼できる方法です。


1
完全を期すために追加することについてどのように:gzip example.txt && mv example.txt.gz example.txt
depquid

2
OPを読むデプイッドはありません-それは洗練されていません。
-goldilocks

@goldilocks「別のファイルを作成し、mv成功した場合。」よりエレガントにできますか?私は、frostschutzの答えに特定の例を追加することを提案しようとしていました。mv思ったよりもエレガントに使用できる場合は、例を挙げてください。
非公開

あなたの提案はシンプルでエレガントで明白なアプローチですが、それが機能するかどうかは非常に多くの変数に依存します。例えば、すでにexample.txt.gzがある場合はどうしますか?また、機能する拡張機能がないため、既にgzip圧縮されたファイルのgzip圧縮を何らかの形で防ぐ必要があります。これはまったく新しいワームの缶ですが、それは実際には問題の一部ではありませんでした。
frostschutz

10

AWS S3へのCIデプロイの一部として、同じ問題がありました。

これは、.gzサフィックスなしでディレクトリを(所定の場所に)再帰的にgzipするためにしたことです:

find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;

私には十分きれいに見えます。しかし、mvどこかにある必要があるようです。

あなたが使用している場合grunt、あなたはで見ることができますgrunt-contrib-compressgruntS3にデプロイするためのツールのいくつかも、gzipを処理します。


1
する必要がありfind . -type ...ませんfind.:)スペースをしてください追加
すごいやつ

2

-S あなたが望む拡張機能

gzip -S "`_date +%Y_%M' dog.txt 

dog.txt_2015_11になります

解凍する場合、拡張子を指定する必要があります。

gzip -d _2015_11 dog.txt_2015_11

UNIXでは、fileコマンドを使用して、使用しているファイルのタイプを判別します。拡張子は誤解を招く、または頻繁に欠落しています。


1

拡張子のないgzipファイルを作成することは本当に適切なことだとは思いません。

IMHoでは、.gzファイルを読み取るようにWebサーバーを構成する必要があります。おそらく次のようなルールがすでにあるはずです。

Path asets/:
  If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
    Add header Content-Encoding: gzip

要求されたファイル名を書き換えて「.gz」を追加するルールを追加するだけです(実際には、クライアントがAccept-Encodingヘッダーにgzipをリストしたことを確認するのと同じように、ファイルが存在することを確認する必要があります)


1

これにはs3_websiteを試すことができます。

scalaとrubyの両方で書かれており、JVMが必要であるという事実は気に入らない。また、私はそれが作る仮定(特にバケットから余分なファイルを削除するという事実)が好きではありませんが、それでうまくいけばうまくいくはずです。

これらの制限のないツールを自分で作成する予定です。ご期待ください。


0

主にこのファイルを他のシステムや人に転送すると、混乱してしまい、圧縮ファイルとして見つけられなくなる可能性があるため、これは実際に行うべきことではありません。

接尾辞を使用したくない場合、GNUはgzip -S ""、aを返すのと同じように、あなたには適していませんgzip: invalid suffix ''

ただし、いつでもgzip -S " "(空白)のようなものを送信でき、次のように表示されます。

$ file testfile\  
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun  3 XX:XX:XX 2014

その後、それを解凍したい場合は、gunzip -c testfile\ (接尾辞を指定せずに)または-fフラグを付けてなどの操作を行う必要があります。

を使用してmvコマンドを追加し&&ても、コードがそれほど面倒になることはないと思います。とにかく、@ frostschutzが言ったように、これを行うのは本当に良い考えではありません。


これは、静的なWebサイトをホストする場合など、圧縮ファイルの提供にS3を使用する場合に必要なものです。あなたはこれを考慮するかもしれません:github.com/laurilehmijoki/s3_website
クリスティアン・マヘルアン・スタンチュ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.