元のファイル名を保持するgzip圧縮ファイルを作成したいと思います。たとえば、「example.txt」をgzippingすると、「example.txt.gz」ではなく「example.txt」という名前のgzip圧縮ファイルが出力されます。1つのコマンドでこれをエレガントに行うことは可能mv
ですか?
元のファイル名を保持するgzip圧縮ファイルを作成したいと思います。たとえば、「example.txt」をgzippingすると、「example.txt.gz」ではなく「example.txt」という名前のgzip圧縮ファイルが出力されます。1つのコマンドでこれをエレガントに行うことは可能mv
ですか?
回答:
これは動作しません:
# 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
成功した場合。これは、最も簡単で理解しやすく、最も信頼できる方法です。
gzip example.txt && mv example.txt.gz example.txt
mv
成功した場合。」よりエレガントにできますか?私は、frostschutzの答えに特定の例を追加することを提案しようとしていました。mv
思ったよりもエレガントに使用できる場合は、例を挙げてください。
AWS S3へのCIデプロイの一部として、同じ問題がありました。
これは、.gz
サフィックスなしでディレクトリを(所定の場所に)再帰的にgzipするためにしたことです:
find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;
私には十分きれいに見えます。しかし、mv
どこかにある必要があるようです。
あなたが使用している場合grunt
、あなたはで見ることができますgrunt-contrib-compress
。grunt
S3にデプロイするためのツールのいくつかも、gzipを処理します。
find . -type ...
ませんfind.
:)スペースをしてください追加
-S
あなたが望む拡張機能
gzip -S "`_date +%Y_%M' dog.txt
dog.txt_2015_11になります
解凍する場合、拡張子を指定する必要があります。
gzip -d _2015_11 dog.txt_2015_11
UNIXでは、fileコマンドを使用して、使用しているファイルのタイプを判別します。拡張子は誤解を招く、または頻繁に欠落しています。
拡張子のない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をリストしたことを確認するのと同じように、ファイルが存在することを確認する必要があります)
これにはs3_websiteを試すことができます。
scalaとrubyの両方で書かれており、JVMが必要であるという事実は気に入らない。また、私はそれが作る仮定(特にバケットから余分なファイルを削除するという事実)が好きではありませんが、それでうまくいけばうまくいくはずです。
これらの制限のないツールを自分で作成する予定です。ご期待ください。
主にこのファイルを他のシステムや人に転送すると、混乱してしまい、圧縮ファイルとして見つけられなくなる可能性があるため、これは実際に行うべきことではありません。
接尾辞を使用したくない場合、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が言ったように、これを行うのは本当に良い考えではありません。