如何删除正在连续写入的文件的较旧内容?

我有一个模拟运行,并期望它继续至less10个小时。 我已经把控制台放到一个.txt文件使用

(binary) > out.txt 

out.txt变得太大了。 我不需要在这个文件中的很多内容。 如何在不损害写入过程的情况下删除该文件的旧版本? 将在模拟结束时写入的内容对我很重要。

正如Carl在评论中提到的那样,你不能在一个积极的写日志文件上做到这一点。 但是,如果初始数据与您无关,您可以执行以下操作(但注意您将丢失所有数据)

 > out.txt 

将来,您可以使用一个名为logrotate(8)

你可以使用tail只存储文件的结尾:

 # Say you want to save the last 100 lines your_binary | tail -n 100 > out.txt 

这假定输出在某一点结束。

看到你的意见 – 文件现在是10 GB …尝试使用sed -i减小大小,以便它可以与其他工具一起工作,如果你想完全擦除它,那么:> logfile。

工具可以应付一个文件,这是一样大的缓冲区,否则他们应该流…..分裂的东西不会工作在一个4 GB的文件,不知道他们是否做了代码调整,这是长期因为我不得不使用一个很大的文件。

两点建议:

1

有几种方法我可以像使用分裂一样思考….但是几乎所有的方法都涉及从日志(简化版本)创建一个单独的文件并重命名或重定向到该文件。

使用split将日志分解为较小的日志(split -l 100 …),并将程序输出重定向到最近使用ls -1找到的最近日志。 这似乎工作正常。

2

另外我尝试了第二种方法来编辑/截断同一文件中的前10行……

 Kaizen ~/shell_prac $ cat zcntr.sh ## test truncate a log file ##set -xv :> zcntr.log ; ## fxn cntr_log() { limit=$1 ; start=0 ; while [ $start -lt $limit ] do echo "count is $start" >> zcntr.log ; ## generate a continuous log start=$(($start + 1)); sleep 1; cnt=$(($start % 10)) ; if [ $cnt -eq 0 ] ## check to truncate the top 10 lines using sed then echo "truncate at $start " >> zcntr.log ; sed -i "1,10d" zcntr.log ; fi done ; 

}

 ## main cntrlr echo "enter a limit" ; read lmt ; cntr_log $lmt ; 

这似乎工作我测试了一个计数器打印,直到值25输出:

 Kaizen ~/shell_prac $ cat zcntr.log count is 19 truncate at 20 count is 20 count is 21 count is 22 count is 23 count is 24 

我认为两者中的任何一个都会有所帮助。

让我知道如果有什么其他的你的想法!