如何截断用于重定向标准输出的文件

如何截断用于重定向标准输出的文件

我正在尝试截断一个文件,用于重定向标准输出。例如:

ping localhost>/tmp/test.log

如果我调用rm /tmp/test.log,则重定向停止,但命令有效。

如果我调用truncate -s0 /tmp/test.log>/tmp/test.logecho ..和等,重定向有效,但文件包含前导零,因为流位置没有改变。

我怎样才能截断该文件?

答案1

未雨绸缪:

  1. 如果文件存在,则截断或删除它。
  2. 使用>>而不是>

这样,您将利用>>本质上“始终寻找文件末尾”的事实,同时>保持指向最后写入位置的指针。

然后你可以截断文件并>>会遵守。参见我的这个答案,它会调查您所需要的确切行为。

答案2

在回答这个问题之前,您需要了解 Unix 文件系统。

唯一rm能做的就是删除文件姓名,实际上是从目录结构指向磁盘块的指针。

当你跑步时

ping localhost > /tmp/test.log
rm /tmp/test.log

重定向不会停止。命令会继续运行,数据会继续在磁盘区域累积。您根本无法访问这些数据,因为您已删除其名称。

您可以自由创建一个名为的完全不相关的文件/tmp/test.log

正如您所指出的,通过尝试截断文件,您会删除曾经存在的数据,但内部文件描述符知道它指向的文件中的位置,并在文件末尾写入扩展文件。因此前导零。

如果您想“重置”重定向,那么您需要终止程序ping,删除或截断/tmp/test.log文件,然后重新启动该ping程序。

你也可以使用类似rotatelogs

ping localhost | rotatelogs ping.out.%Y%m%d.%H%M 600

根据经过的时间或文件的大小轮换日志文件。

相关内容