
ハードディスク使用率が90%のコンピュータがあります。 500を超えるログファイルをより小さな新しいファイルに圧縮したいと思います。しかし、ハードドライブは元のファイルと圧縮ファイルの両方を入れるには小さすぎます。
したがって、必要なのは、すべてのログファイルを新しいファイルに1つずつ圧縮し、圧縮後に元のファイルをそれぞれ削除することです。
Linuxでこれを行うにはどうすればよいですか?
答え1
私は直接タールソリューションを思い出しました。
個々のファイルをターゲットファイルに圧縮して削除します。
しかし、圧縮速度はそれほど高速ではありません。コマンドは次のとおりです。
tar -zcvf my_log.tar.gz *.log --remove-files
答え2
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
修正する@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
、またはそれらの間のオプションを使用)。
答え3
bashでioリダイレクトを使用すると、>
新しいデータが書き込まれる前に元のファイルが空になります。
書き込み前にファイルを空にするのではなく、ファイルの一部の内容を上書きするddコマンドがあるため、次のことができます。
gzip -c some-file | dd conv=notrunc of=some-file
ほとんどの場合、圧縮データは元のデータよりも小さいです。 gzipが最初のNバイトを読み取ったときにMバイトのみを出力します(ここでM < N)。したがって、元のファイルの最初のMバイトを圧縮データで上書きし、最初のNバイト以降のデータを保持することは安全です。データは変更されません。 。
しかし、gzipが終わった後もデータがあるでしょう。
しかし、ddがgzipよりも速く書くとどうなるかわかりません。
あるいは、losstupを介してファイルをブロックデバイスにマッピングすることもできます。ブロックデバイスの場合、書き込み操作により元のデータは消去されません。
loop_device=$(losetup -f--show some-file)
gzip -c $loop_device > $loop_device
答え4
BSDバージョンのtarでこれを実行しようとしています。この場合、 --remove-files オプションは使用できません。私がやっとしたこと(そして働いたこと)は次のとおりです。
find folder_to_tar -type f -exec tar --append --file=output_tar_file.tar {} \; -exec rm -v {} \;