web-dev-qa-db-ja.com

ファイルをインプレースで圧縮するにはどうすればよいですか?

ハードディスク使用率が90%のマシンを使用しています。 500以上のログファイルをより小さな新しいファイルに圧縮します。ただし、ハードディスクが小さすぎて、元のファイルと圧縮されたファイルの両方を保持できません。

したがって、必要なのは、すべてのログファイルを1つの新しいファイルに1つずつ圧縮し、圧縮された各オリジナルを削除することです。

Linuxではどうすればよいですか?

20
Zen

gzipまたはbzip2はファイルを圧縮し、圧縮されていないファイルを自動的に削除します(これがデフォルトの動作です)。

ただし、圧縮処理中は両方のファイルが存在することに注意してください。

ログファイル(つまり、テキストを含むファイル)を圧縮する場合は、bzip2、テキストファイルの比率が高いため。

bzip2 -9 myfile       # will produce myfile.bz2

比較と例:

$ ls -l myfile
-rw-rw-r-- 1 apaul apaul 585999 29 april 10:09 myfile

$ bzip2 -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 115780 29 april 10:09 myfile.bz2

$ bunzip2 myfile.bz2

$ gzip -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 146234 29 april 10:09 myfile.gz

[〜#〜] update [〜#〜]@Jjoaoがコメントで教えてくれたように、興味深いことに、xzにはデフォルトオプションを使用したプレーンファイルでの最適な比率:

$ xz -9 myfile

$ ls -l myfile*
-rw-rw-r-- 1 apaul apaul 109384 29 april 10:09 myfile.xz

詳細については、さまざまなツールの興味深いベンチマークを以下に示します。 http://binfalse.de/2011/04/04/comparison-of-compression/

上記の例では、-9最適な圧縮率が得られますが、データの圧縮に必要な時間が比率よりも重要である場合は、使用しないことをお勧めします(低いオプション、つまり-1、またはその間の何か)。

20
apaul

私は自分でtarソリューションを見つけました。
ターゲットファイルに圧縮した後、単一のファイルを削除します。
ただし、圧縮速度はそれほど速くありません。コマンドは次のようになります。

tar -zcvf my_log.tar.gz *.log --remove-files
15
Zen

私はこれをBSDバージョンのtarでやろうとしていました。この場合、-remove-filesオプションは使用できません。私がやった(そして働いた)のは:

find folder_to_tar -type f -exec tar --append --file=output_tar_file.tar {} \; -exec rm -v {} \;
1
pgilmon

@apaulの補足として、ファイルを個別に圧縮することを強調します

 bzip2 *.log.*

(bzip2をgzip、xz、またはお気に入りのファイルZipで置き換えてください)が重要な場合があります。

このようにして、(bzcat file.bz2)、 探す (bzgrep file.bz2)、編集(vi file.bz2)圧縮ファイルを作成し、必要に応じて古いファイルを削除します。

1
JJoao