如何正确清空文件

如何正确清空文件

好的,我正在尝试清空一个文件。这是一个文本日志文件,正在连续写入。我的 ls -lh 显示它有 3GB

我跑

 > file.log

我的 ls -lh 显示它仍然是 3GB

但是包含此文件的文件夹大小少了 3GB。奇怪的是,数了数行数,发现它不是空的,而且我无法用 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

或者,如果你的操作系统有它,

truncate file.log --size 0

将会将其截断为 0 字节。

如果文件没有任何换行符,则整个文件可能只有 1 行长,这解释了 3GB 的文件。

您可以使用以下命令获取文件样本

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

这将占用文件的前 200 个字节。(如果需要更多,请将“bs”参数增加到 4096,如果需要更多,请使用 count 参数,即获取 8192 个块,count=2 bs=4096)

@Archemar 的建议很好,但我不确定它是否能回答你的问题。

相关内容