【问题标题】:Unix shell script to truncate a large file用于截断大文件的 Unix shell 脚本
【发布时间】:2012-11-14 13:22:21
【问题描述】:

我正在尝试编写一个 Unix 脚本,该脚本将截断/清空应用程序在达到 3GB 空间时不断写入/打开的文件。我知道下面的命令会做到这一点:

cp /dev/null [filename]

但我将在生产环境中自动运行它作为 cron 作业 - 只是在这里发布,看看你们在做类似的事情时是否遇到任何问题。

【问题讨论】:

  • 这些是产品。日志没有价值?我很幸运将我的生产日志保存了一年以上(在 bzip2 -9 fmt 中),并且有一些小型实用程序可以轻松提取作业运行时间、处理的记录,并且在加载到电子表格时很容易计算和绘制加载率和一堆东西。由于负载率下降,我们发现了 hdwr 问题。是的,那里有可爱的监控工具,所以这完全取决于您的情况。作为一个单独的选项,您是否看过logrotate,它可能会为您提供一些价值(但设置它很烦人(只是猜测)!)。
  • 请注意,如果使用 O_APPEND 标志打开日志文件,则截断是有效的。如果没有用 O_APPEND 标志打开,那么程序会在偏移量 3 GiB 处继续写入(第一次);系统会将前 3 GiB 视为全零字节(压缩得很好),但文件将继续增长。这一切都取决于编写日志的程序。

标签: bash shell truncate


【解决方案1】:

只是添加另一个答案,

: > filename

: 是 bash 中的无操作(符合 POSIX),因此这实际上只是打开文件进行写入(当然会截断文件)然后立即关闭它。

编辑:正如 shellter 评论的那样,您实际上不需要命令来进行重定向:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

一个简单的重定向本身将清除文件。

【讨论】:

  • 或者只是> filename(我相信你知道)。祝大家好运。
  • @shelter "$ > file" 不是 POSIX 且不可移植。如最初建议的那样,您应该在重定向之前使用“:” no-op 命令。
  • +plus 表示笑脸
  • 正如@AaronToponce 指出的那样,“$ > file”确实不可移植;在我的 Zsh 设置中,它使 shell 挂起(据说等待输入)。 "$ : > file" 在 Zsh 中工作得很好。
  • @TechEnthusiast 这取决于您的期望。截断本身是原子的,但你并不真正知道它何时会相对于任何特定的写入发生。例如,您可以在文件开头使用部分行结束。
【解决方案2】:

我在debian上使用过以下命令

truncate -s 0 filename

【讨论】:

  • @SteveClay: sudo sh -c ': > filename' 也会截断filename
  • @SteveClay OPs 的建议也与sudo 完美配合:sudo cp /dev/null filenamecp 也是可移植的,而 truncate 仅适用于现代 Linux。
【解决方案3】:

这对我来说似乎很合理。当然,Unix 可以让你用大约 50 种不同的方式来做这件事。例如,

echo -n "" >filename
cat /dev/null >filename

【讨论】:

    【解决方案4】:

    trunc filename

    适用于 AIX 风格的 UNIX

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多