【问题标题】:How to empty ("truncate") a file on linux that already exists and is protected in someway?如何清空(“截断”)Linux上已经存在并以某种方式受到保护的文件?
【发布时间】:2011-01-26 06:25:41
【问题描述】:

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

cat /dev/null > error.log

我收到消息

File already exists.

显然,在服务器上进行了某种配置,以防止意外覆盖文件。谁能告诉我如何在单个命令中“截断”文件?

【问题讨论】:

  • 对于未受保护的文件,截断 -s 0 文件有效。

标签: linux file command-line


【解决方案1】:

我喜欢这样: cp /dev/null file

【讨论】:

    【解决方案2】:

    任何人都可以尝试这个命令来截断linux系统中的任何文件

    这肯定适用于任何格式:

    truncate -s 0 file.txt
    

    【讨论】:

      【解决方案3】:

      这要归功于我的高级同事:

      :> filename
      

      这不会破坏日志文件,因此您甚至可以在系统日志中使用它。

      【讨论】:

      • 请解释一下。它是如何工作的?那个符号在做什么?
      • @user31986 : 是无效命令(几乎是注释),然后> 像往常一样重定向,因此这只是将缺少输出的命令重定向到不执行任何操作的命令中文件。如果启用 noclobber,则需要 :>| filename (bash)(我假设 csh 中的 :>! filename 假设 csh 具有 :)。
      【解决方案4】:

      由于 sudo 不适用于 redirection >,因此我喜欢 tee 命令用于此目的

      echo "" | sudo tee fileName
      

      【讨论】:

      • 嗯,实际上确实如此,如您链接的问题和上面的问题中所述。 “sudo sh -c '> error.log'”...
      • 这取决于目标文件error.log的权限,如果已经可写,则不需要sudo。我认为另一个问题是您将命令作为字符串参数传递给 sh ,我不知道这是如何在内部处理的,但这是增加了另一层复杂性/重定向
      • 这实际上不会截断文件,因为echo "" 会添加一个换行符。您可以使用echo -n "" 来禁止换行
      【解决方案5】:

      你也可以使用函数truncate

      $truncate -s0 yourfile
      

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

      $sudo truncate -s0 yourfile
      

      帮助/手册:ma​​n truncate

      在 ubuntu Linux 上测试

      【讨论】:

      • truncate 还涉及文件的修改时间 - 而 ">file" 如果文件未更改,则不会涉及。
      • 它不会释放文件所在的磁盘空间。起初它显示 0 字节。但是当您向该文件写入内容时,文件大小为 = 截断前 + 新数据大小。
      • @AniketKulkarni 那是因为你的文件没有用 APPEND 标志打开,所以它保留了写缓冲区,当它更新缓冲区时,它会将整个缓冲区刷新到文件中,这就是你看到它的方式大小相同 + 增加。
      【解决方案6】:

      你也可以试试:

      echo -n > /my/file

      【讨论】:

      • 看到大量选票的答案了吗?尝试阅读它,然后查找 noclobber,然后问问自己你的答案是否有意义。
      【解决方案7】:

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

      > error.log
      

      【讨论】:

      • 实际上,这个 doesn't 与 noclobber 一起工作(我自己测试过),所以在这种情况下它不是一个有效的解决方案(“-bash: error.log: cannot overwrite现有文件");请参阅上面的推荐(“@Jarmund - 因为用户设置了 noclobber,>file 不起作用。”)。我只是想知道什么样的“聪明人”会支持这样明显错误的答案......
      【解决方案8】:

      false|tee fileToTruncate

      也可以

      【讨论】:

      • 这太傻了。或者,如果这很有用,让dd 不输出任何内容会比普通可读的false 更好?
      【解决方案9】:

      您设置了noclobber 选项。错误看起来像是来自 csh,所以你会这样做:

      cat /dev/null >! file
      

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

      cat /dev/null >| file
      

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

      >| file
      

      【讨论】:

      • 你说的shell是csh是对的。你怎么知道的?
      • @Wikidkaka - 基于错误消息。我系统上的 csh 给出了类似的 File exists 错误,而 bash 给出了非常不同的 cannot overwrite existing file 错误。
      • @Jarmund - 因为用户设置了 noclobber,>file 不起作用。
      • > file>| file有什么区别?
      • @Will - 如果您设置了noclobber 选项,则尝试重定向到现有文件会失败。要在保留 noclobber 的同时覆盖特定重定向,您可以使用 >|
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2021-08-16
      • 2012-10-24
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多