ファイルを適切に空にする方法

ファイルを適切に空にする方法

わかりました。ファイルを空にしようとしています。これは継続的に書き込まれているテキスト ログ ファイルです。ls -lh によると 3GB です。

走る

 > file.log

ls -lhではまだ3GBと表示される

しかし、このファイルを含むフォルダーのサイズは 3 GB 未満です。奇妙なことに、行数を数えると空ではないことがわかりますが、vim で開くことができません (大きすぎる)。

管理者権限はありませんが、ファイルの所有者です。

何が起こっているのかを確認するために、最初の行だけを含む新しいファイルを作成しようとしました

head -1 file.log > first_line.txt

そして、first_line.txt は 3GB です。これは確かに奇妙な動作です。

質問 1: 最初のコマンドでファイルが空にならないのはなぜですか?

質問 2: ファイルを削除せずに空にするにはどうすればよいでしょうか?

ありがとう、

コメント後の編集: ファイルは他のプロセスによって継続的に開かれ、書き込まれています。

残念ながら、これらのプロセスに干渉することはできないため、一時的に終了したり再起動したりすることはできません。

答え1

ファイルはプロセスによって保持されているため、削除できません。

lsof file.logどのプロセスが書き込んでいるかを知るために使用します。

それから

mv file.log old.file.log

プロセスを再起動します。(これはプロセスによって異なります)。

次に、 を削除できるようになりますold.file.log

ファイル ID がリストされている場合は、/etc/logrotate.d/*logrotate コマンドを発行できます。

答え2

ファイルを(ほぼ)空にするには、次のコマンドを使用します。

echo "" > file.log

または、OSにそれが備わっている場合は、

truncate file.log --size 0

0 バイトに切り捨てられます。

ファイルに改行がない場合、ファイル全体が 1 行の長さになり、3 GB のファイルになることがあります。

次のようなコマンドを使用してファイルのサンプルを取得できます。

dd if=file.log of=firstpart.txt count=1 bs=200

これはファイルの最初の 200 バイトを取得します。(さらに必要な場合は、「bs」パラメータを 4096 まで増やします。それ以上必要な場合は、count パラメータを使用します。つまり、8192 ブロックを取得するには、count=2 bs=4096 です)

@Archemar のアドバイスは良いですが、あなたの質問に答えているかどうかはわかりません。

関連情報