清空文件内容


220

我知道三种删除文件中所有条目的方法。

他们是

  • >filename
  • touch filename
  • filename < /dev/null

在这三个中,我滥用>filename最多,因为这需要最少的击键次数。

但是,我想知道相对于大型日志文件和小型文件,这三种方法(如果有更有效的方法)中效率最高的一种。

另外,这三个代码如何操作和删除内容?


24
truncate -s 0 filename
Martin Thoma 2014年

cat和'>'之间的区别非常相似,将文件归零,您可以在其中找到更多信息。
斯特凡Chazelas

仅当从bash命令行调用时,第一个才有效,但是如果在.sh文件中执行,则第一个无效
Marco Marsala 2015年

8
touch不会删除内容,但是会更改文件的访问时间。如果不存在,它将创建一个空文件。
hbogert

Answers:


293

实际上,第二种形式touch filename不会从文件中删除任何内容,它只会创建一个不存在的空文件,或者更新现有文件的最后修改日期。

第三个filename < /dev/null尝试使用/dev/null输入作为文件名运行。

cp /dev/null filename 作品。

至于效率,最有效的应该是truncate -s 0 filename; 看到这里:http : //linux.die.net/man/1/truncate

否则,cp /dev/null filename或者> filename两者都很好。他们都使用“打开时截断”设置打开然后关闭文件。 cp也打开/dev/null,因此使其速度稍慢。

另一方面,truncate> filename运行脚本相比,运行速度可能会慢一些,因为运行truncate命令需要系统打开可执行文件,加载可执行文件并运行它。


9
那么,为什么说这truncate是最有效的呢?
斯特凡Chazelas

7
截断操作使用ftruncate()或truncate()系统调用,它们不会打扰打开文件。它还避免了cp和> filename方法需要调用的close()系统调用。
2013年

3
实际上,它(至少是GNU一个)执行open + ftruncate + close(除了它进行加载和初始化本身的许多系统调用之外),因为无论如何,它必须创建文件(如果文件不存在)并truncate(2)不会那样做。
斯特凡Chazelas

如果使用touch filename,则inode会保持不变(前提是之前有文件)?
pMan

1
@pMan是的,你可以尝试,并检查ls -i
terdon


3

有一个内置命令“:”,可以在sh,csh,bash和其他命令中使用,可以与重定向输出运算符>截断文件一起轻松使用:

#!/usr/bin/env bash
:> filename

我喜欢的是,它不需要任何外部命令,例如“ echo”等。

截断文件而不是删除/重新创建文件的一大优点是,运行与此文件一起使用的应用程序(例如,某人制作了tail -f filename或监视软件,...)无需重新打开文件。他们只是可以继续使用filedescriptor并获取所有新数据。


man bash:内置的shell 描述为无效。
Haxiel

是的,您将其重定向>到文件中,如果文件不存在,则会创建该文件;如果文件存在,则将其截断为零。更好的说:您使用:不会执行任何操作,并且使用>不会将任何内容重定向到文件并截断​​它。
米尔科·斯坦纳

1
为什么要这么做?> file足以截断文件。您不需要任何命令,只需重定向操作符。
terdon

1
有时, > filename将无法正常工作。例如,在zsh中。但: > filename仍然可以。
CS裴

Bash和sh似乎喜欢> myfile但例如csh错误,包含:无效的null命令。
Mirko Steiner '18
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.