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

时间:2013-05-28 03:12:23

标签: linux windows bash file-io io-redirection

我有一个模拟运行,并期望它继续至少10个小时。我已经使用

将控制台指向了.txt文件
(binary) > out.txt

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

4 个答案:

答案 0 :(得分:2)

作为评论中提到的Carl,您无法在主动写入的日志文件中真正执行此操作。但是,如果初始数据与您无关,您可以执行以下操作(但提防您将丢失所有数据)

> out.txt

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

的实用程序

答案 1 :(得分:0)

您可以使用tail仅存储文件末尾:

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

这假设输出在某个时刻结束。

答案 2 :(得分:0)

看到你的评论 - 文件现在是10 GB ...尝试使用sed -i减小尺寸以便它可以与其他工具一起使用,如果你想完全删除它那么:>日志文件中。

工具可以处理一个与缓冲区一样大的文件,否则它们应该被流式传输......像split这样的东西不能用于4 GB的文件,不知道他们是否为此进行了代码调整,它已经很久了,因为我不得不使用一个很大的文件。

两个建议:

1

我可以想到一些方法,比如使用split ....但几乎所有方法都涉及从日志中创建一个单独的文件(缩减版本)并重命名或重定向到该文件。

使用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

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

如果您有其他想法,请告诉我!!

答案 3 :(得分:0)

使用 cat 截断文件

> cat /dev/null > out.txt