Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用于截断大文件的Unix shell脚本_Bash_Shell_Truncate - Fatal编程技术网

Bash 用于截断大文件的Unix shell脚本

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 再补充一句, : &

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

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。