如何清空(“截断”)Linux上已经存在并受到某种方式保护的文件?


113

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

cat /dev/null > error.log

我收到消息

File already exists.

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


2
对于不受保护的文件,请截断-s 0文件。
普拉莫德(Pramod)2012年

Answers:


158

您已设置noclobber选项。该错误看起来像是来自csh,因此您可以执行以下操作:

cat /dev/null >! file

如果我错了并且您正在使用bash,则应该执行以下操作:

cat /dev/null >| file

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

>| file

你是正确的外壳是csh。你怎么知道的?
Sumeet Pareek 2010年

6
@Wikidkaka-基于错误消息。我的系统上的csh给出了类似的File exists错误,而bash给出了非常不同的cannot overwrite existing file错误。
R Samuel Klatchko 2010年

6
@Jarmund-由于用户设置了noclobber,因此>file无法正常工作。
R Samuel Klatchko

> file和之间有什么区别>| file
2014年

1
@Will-如果noclobber设置了选项,则尝试重定向到现有文件将失败。要在保留noclobber的同时覆盖特定的重定向,可以使用>|
R Samuel Klatchko

71

您也可以使用功能truncate

$truncate -s0 yourfile

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

$sudo truncate -s0 yourfile

帮助/手册:截断人

在ubuntu Linux上测试


1
截断还涉及文件的修改时间-如果文件未更改,则“文件”不涉及。
dsteinkopf

它不会释放文件保存的磁盘空间。首先,它显示0字节。但是,当您向该文件中写入内容时,文件大小为=截断前+新数据大小。
Aniket Kulkarni,

48

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

> error.log

6
实际上,这不适用于noclobber(我自己测试过),因此在这种情况下不是有效的解决方案(“ -bash:error.log:无法覆盖现有文件”);请参阅上面的推荐(“ @Jarmund-因为用户设置了noclobber,所以> file不起作用。”)。我只是想知道什么样的“智能人”支持这样的错误答案呢?

9

功劳归功于我的高级同事:

:> filename

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


8
请解释。它是如何工作的?该符号在做什么?
user31986 '16

2
@ user31986 :是无效命令(几乎是注释),然后>像往常一样是重定向,因此这只是将不执行任何操作的命令的输出重定向到文件中。如果启用了noclobber,则需要:>| filename(bash)(:>! filename假设csh具有,我假设在csh中:)。
Rhubbarb

4

false | tee fileToTruncate

可能也可以


那真是愚蠢。或者,如果这很有用,那么晦涩难懂dd地什么也不输出比纯文本可读性还要好false
网点

2

由于sudo不适用于重定向 >,因此我喜欢此tee命令

echo "" | sudo tee fileName

嗯,实际上确实如此,如您链接的问题和上文所述。“ sudo sh -c'> error.log'” ...

它取决于目标文件的权限error.log,如果该权限已可写,则无需sudo。我认为另一个问题是您将命令作为字符串参数传递给sh,我不知道该如何内部处理,但这又增加了另一层复杂性/重定向
sakhunzai 2014年

1
这实际上不会截断文件,因为echo ""会添加换行符。您可以使用echo -n ""取消换行符
Seb 2016年

0

任何人都可以尝试使用此命令截断Linux系统中的任何文件

这肯定会以任何格式工作:

truncate -s 0 file.txt


-4

您也可以尝试:

echo -n > /my/file


8
看到大量的答案吗?尝试阅读它,然后抬头noclobber,然后问问自己自己的答案是否有意义。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.