
元のファイル名を保持するgzip圧縮ファイルを作成したいと思います。たとえば、「example.txt」をgzipに圧縮すると、「example.txt.gz」の代わりに「example.txt」という名前のgzipファイルが出力されます。後続のコマンドを実行せずに1つのコマンドでこれを正常に実行できますかmv
?
答え1
これはうまくいきません:
# 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
成功しました。これはあなたが見つけることができる最も簡単で、理解しやすく、最も信頼できる方法です。
答え2
AWS S3のCIデプロイメントの一部として同じ問題が発生しました。
これは、サフィックスなしでディレクトリを再帰的にgzipするために実行することです.gz
。
find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;
私が見るには十分にきれいだようだ。しかし、はい、あなたはどこかにいるべきだと思いますmv
。
お使いの方は、grunt
ご覧くださいgrunt-contrib-compress
。 S3展開用に特別に設計された一部のgrunt
ツールはgzipも処理します。
答え3
-S
希望の拡張プログラム
gzip -S "`_date +%Y_%M' dog.txt
dog.txt_2015_11を生成します。
解凍時に拡張子を指定する必要があります。
gzip -d _2015_11 dog.txt_2015_11
Unixでは、fileコマンドを使用して、持っているファイルの種類が何であるかを確認します。拡張子は誤解を招くか、しばしば欠けています。
答え4
あなたは試すことができますs3_ウェブサイトこのために。
私はこれがスカラーとルビーで書かれていることとJVMが必要であることを気にしません。また、私はそれが作る仮定(特にバケットから追加のファイルを削除するという事実)が好きではありませんが、満足すればうまくいきます。
私はこれらの制限なしに独自のツールを作成する予定ですので、見続けてください。