Bash 用于截断大文件的Unix shell脚本
我正在尝试编写一个Unix脚本,它将截断/清空一个应用程序不断写入/打开的文件,比如说3GB的空间。我知道下面的命令可以做到这一点:Bash 用于截断大文件的Unix shell脚本,bash,shell,truncate,Bash,Shell,Truncate,我正在尝试编写一个Unix脚本,它将截断/清空一个应用程序不断写入/打开的文件,比如说3GB的空间。我知道下面的命令可以做到这一点: cp /dev/null [filename] 但我将在生产环境中自动运行它作为一个cron作业-只是在这里发布,看看你们在做类似的事情时是否遇到任何问题 我觉得这很合理。当然,Unix可以让您用大约50种不同的方法来实现这一点。比如说, echo -n "" >filename cat /dev/null >filename 再补充一句, : &
cp /dev/null [filename]
但我将在生产环境中自动运行它作为一个cron作业-只是在这里发布,看看你们在做类似的事情时是否遇到任何问题 我觉得这很合理。当然,Unix可以让您用大约50种不同的方法来实现这一点。比如说,
echo -n "" >filename
cat /dev/null >filename
再补充一句,
: > filename
:
是bash中的no-op(兼容POSIX),因此这实际上只是打开文件进行写入(当然会截断文件),然后立即关闭它
编辑:正如Shelleter所评论的,您实际上不需要命令来执行重定向:
$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$
一个简单的重定向本身就会清除文件。我在debian上使用了以下命令
truncate -s 0 filename
trunc文件名
可以在AIX风格的UNIX上工作,或者只需
>文件名
(我相信您知道)。祝大家好运。@SHEET“$>文件”不是POSIX,也不可移植。正如最初建议的那样,在重定向之前应该使用“:”no op命令。+plus对于smiley faceAs@AaronToponce指出,“$>文件”确实是不可移植的;在我的Zsh设置中,它使shell挂起(假定正在等待输入)。“$:>文件”在Zsh中工作得很好。@TechFander这取决于您的期望。截断本身是原子的,但您不知道相对于任何特定的写入,它何时会发生。例如,您可能会在文件的开头出现一个部分行。这些是生产日志没有价值吗?我很幸运地保留了一年以上的生产日志(在bzip2-9FMT中),并且有一些小的实用程序,可以很容易地提取作业运行时,处理记录,当加载到电子表格中时,可以很容易地计算和绘制加载比率和一系列内容。我们发现了hdwr问题,因为负载比下降。是的,有可爱的监控工具,所以这一切都取决于你的情况。作为一个单独的选项,您是否查看过logrotate
,它可能会为您提供一些价值(但设置它会让您感到恼火(只是猜测)!)。请注意,如果日志文件是使用O_APPEND标志打开的,则截断是有效的。如果未使用O_APPEND标志打开,则程序将继续在偏移量3 GiB处写入(第一次);系统会将前3个GiB视为所有字节为零(压缩良好),但文件将继续增长。这完全取决于编写日志的程序。可能重复的@SteveClay:sudo sh-c':>filename'
也将截断filename
@SteveClay OPs建议也可以完美地处理sudo
:sudo cp/dev/null filename
。另外,cp
是可移植的,而truncate
仅适用于现代Linux。