Unix shell脚本截断一个大文件

pee*_*dee 82 bash shell truncate

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

cp /dev/null [filename]
Run Code Online (Sandbox Code Playgroud)

但是我将在生产环境中自动将其作为一个cron作业运行 - 只需在此处发布,看看你们在做类似的事情时是否遇到任何问题.

che*_*ner 110

只是为了添加另一个答案,

: > filename
Run Code Online (Sandbox Code Playgroud)

: 是bash中的无操作,所以这基本上只是打开文件进行写入(当然会截断文件),然后立即关闭它.

编辑:作为shellter评论,你实际上并不需要一个命令来进行重定向:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$
Run Code Online (Sandbox Code Playgroud)

单独的简单重定向将清除文件.

  • 或者只是`> filename`(我相信你知道).祝你们好运. (23认同)
  • @shelter"$> file"不是POSIX而不是便携式的.您应该在重定向之前使用":"no-op命令,如最初建议的那样. (5认同)
  • 正如@AaronToponce 指出的那样,“$ > file”确实不可移植;在我的 Zsh 设置中,它使 shell 挂起(据说是在等待输入)。“$ : > file”在 Zsh 中工作得很好。 (4认同)
  • +加上笑脸 (2认同)
  • 这些操作在文件系统级别序列化,但写入不一定是原子的,而截断却是原子的。例如,如果一个进程执行 `echo "foo bar"`,而另一个进程截断文件,则可能有 3 个操作 `write "foo "`、`truncate` 和 `write "bar"`。(对于如此小的写入,它被分割的可能性很小,但不是零。但是,截断保证是单个、不间断的操作。) (2认同)

Ric*_*mon 63

我在debian上使用了以下命令

truncate -s 0 filename
Run Code Online (Sandbox Code Playgroud)

  • 与`sudo`一起使用的唯一答案 (4认同)
  • @SteveClay OP的建议也可以与sudo完美配合:sudo cp / dev / null filename。同样,`cp`是可移植的,而`truncate`仅适用于现代Linux。 (2认同)

Don*_*son 11

这对我来说似乎很合理.当然,Unix会让你以50种不同的方式做到这一点.例如,

echo -n "" >filename
cat /dev/null >filename
Run Code Online (Sandbox Code Playgroud)