如何在Linux上清空("截断")一个已经存在且受到保护的文件?

Sum*_*eek 111 linux command-line file

我的服务器上有一个名为error.log的文件,我需要经常截断.我对该文件拥有rw权限.在vi中打开文件>删除所有内容>保存工作(显然).但是当我尝试下面的时候

cat /dev/null > error.log
Run Code Online (Sandbox Code Playgroud)

我收到了消息

File already exists.
Run Code Online (Sandbox Code Playgroud)

显然,在服务器上进行了某种配置以防止意外覆盖文件.任何人都可以告诉我如何在一个命令中"截断"文件?

R S*_*hko 157

你有noclobber选择权.该错误看起来像是来自csh,所以你会这样做:

cat /dev/null >! file
Run Code Online (Sandbox Code Playgroud)

如果我错了你正在使用bash,你应该这样做:

cat /dev/null >| file
Run Code Online (Sandbox Code Playgroud)

在bash中,您还可以将其缩短为:

>| file
Run Code Online (Sandbox Code Playgroud)

  • @Wikidkaka - 基于错误消息.我的系统上的csh给出了类似的`File exists`错误,而bash给出了非常不同的`不能覆盖现有文件`错误. (6认同)
  • @Jarmund - 因为用户有noclobber设置,`> file`不起作用. (6认同)
  • @Will - 如果您设置了“noclobber”选项,则尝试重定向到现有文件会失败。要在启用 noclobber 的同时覆盖特定重定向,您可以使用 `>|` (2认同)

ris*_*dar 71

您还可以使用函数截断

$truncate -s0 yourfile
Run Code Online (Sandbox Code Playgroud)

如果权限被拒绝,请使用sudo

$sudo truncate -s0 yourfile
Run Code Online (Sandbox Code Playgroud)

帮助/手动:man truncate

在ubuntu Linux上测试过


SIF*_*IFE 49

这足以将文件大小设置为0:

> error.log
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这个**不适用于noclobber(我自己测试过),所以在这种情况下它不是一个有效的解决方案("-bash:error.log:不能覆盖现有文件"); 请参阅上面的推荐("@ Jarmund - 因为用户有noclobber设置,>文件不起作用.").我只是想知道什么样的"聪明人"支持这样明显错误的答案...... (5认同)

pet*_*nar 7

我的高级同事为此付出了代价:

:> filename
Run Code Online (Sandbox Code Playgroud)

这不会破坏日志文件,因此您甚至可以在syslog上使用它.

  • 请解释.它是如何工作的?那个符号在做什么? (8认同)
  • @ user31986`:`是一个无效命令(几乎是一个注释),然后`>`像往常一样重定向,因此这只是重定向缺少输出的命令,该命令对文件没有任何作用.如果启用了noclobber,则需要`:> | filename`(bash)(我假设csh中的`:>!filename`假设csh有`:`). (2认同)