ファイルのサイズをブルートフォースで縮小したいのです。つまり、残りは気にせず、ファイルを半分にカットして、残りを破棄します。
最初に頭に浮かぶのは、Perlの truncate です。そのページの例に従って、まったく同じことを行いました。
seq 9 > test.txt
ls -l test.txt
Perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'
ただし、ファイルのサイズは同じです。
$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt
どうすればこれを機能させることができますか?
truncateコマンド を使用することをお勧めします。
truncate --size=1G test.txt
SIZEは、バイト、KB、K、MB、Mなどで指定できます。希望するサイズを手動で計算できると思います。そうでない場合は、おそらくstatコマンドを使用して、ファイルの現在のサイズに関する情報を取得できます。
Perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'
ファイルを読み取り用に開きます。ただし、ファイルを切り捨てるにはファイルを変更する必要があるため、読み取り専用のファイルハンドルは機能しません。 「変更」モードを使用する必要があります("+>"
)。
副次的な問題として、システムコールが静かに失敗し、何が悪いのかを尋ねる人がいると、いつも驚かされます。 必須問題の診断の一部は、生成されたエラーメッセージを確認することです。あなたがそれを理解していなくても、あなたが助けを求める人々の生活をずっと楽にします。
次の方が多少役立つでしょう:
Perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
truncate(FILE, 8) or die "truncate: $!";
close(FILE);'
確かにそれは「無効な引数」しか報告しなかったでしょう。それでも、それは有用な情報であり、(私にとっては)オープンモードが間違っているという結論に導いたかもしれません。
tail
を使用して、最後の100000バイトを切り取ることができます。例:
tail -c 100000ファイル> file2
-cは、ファイルの最後の100000バイトを出力します。さらに多くのオプションがあります。
男のしっぽ
元のファイルを生成したばかりのファイルで置き換えるには:
mv file2ファイル
上記のtruncateを引用した答えはいいです。 ddも機能します。
dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt
edプログラムを使用して、bashでこれを行うには完全に異なる方法があります。次のスクリプトは、指定されたディレクトリにあるすべてのファイルの最後の5000行のみを保持します。これは簡単に変更して、複数のディレクトリをループしたり、行数を変更したりできます。
#!/bin/bash
LOGDIR=/opt/log
SAVELINES=5000
dirs="$LOGDIR"
for dir in $dirs ; do
files=${dir}/*
for f in $files ; do
echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
done
done