Unix Shell脚本截断大文件


87

我正在尝试编写一个Unix脚本,它将截断/清空一个文件,当文件达到3GB的空间时,该文件将被应用程序连续写入/打开。我知道以下命令可以做到:

cp /dev/null [filename]

但是我将在生产环境中自动将其作为cron作业-只是在此处发布以查看你们在执行类似操作时是否遇到任何问题。


这些是产品。日志没有价值?我很幸运地将生产日志保存了一年以上(在bzip2 -9 fmt中),并且拥有一些小型实用程序,可以轻松提取作业运行时,处理记录,并且在加载到电子表格中时可以轻松计算和绘制图表加载率和一堆东西。由于负载比率下降,我们发现了hdwr问题。是的,那里有漂亮的监视工具,所以这完全取决于您的情况。作为一个单独的选择,您是否看过logrotate,它可能会为您提供一些价值(但烦人于设置它(只是猜测)!)。
Shellter

5
请注意,如果使用O_APPEND标志打开日志文件,则截断有效。如果未使用O_APPEND标志打开,则程序将在偏移量3 GiB处继续写入(第一次);否则,程序将继续写入。系统会将前3个GiB视为全字节零(压缩效果很好),但文件将继续增长。这完全取决于编写日志的程序。
乔纳森·勒夫勒

Answers:


116

只是添加另一个答案,

: > filename

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

编辑:正如Shellter所说,您实际上并不需要命令来进行重定向:

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

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


24
或只是> filename(我确定您知道)。祝你们好运。
Shellter

5
@shelter“ $> file”不是POSIX,也不是可移植的。如最初建议的那样,您应在重定向之前使用“:” no-op命令。
亚伦·托彭斯

2
+加上笑脸
ChrisSuszyński2014年

2
正如@AaronToponce指出的那样,“ $>文件”确实不可移植。在我的Zsh设置中,它使外壳挂起(据说正在等待输入)。“ $:> file”在Zsh中可以正常工作。
Linus Arver

1
@TechEnthusiast这取决于您的期望。截断本身是原子的,但是您真的不知道什么时候发生相对于任何特定的写入。例如,您可以在文件的开头加上部分行。
chepner


11

在我看来,这是合理的。当然,Unix可以让您执行大约50种不同的操作。例如,

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

2

trunc filename

适用于UNIX的AIX风格

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.