我知道三种删除文件中所有条目的方法。
他们是
>filename
touch filename
filename < /dev/null
在这三个中,我滥用>filename
最多,因为这需要最少的击键次数。
但是,我想知道相对于大型日志文件和小型文件,这三种方法(如果有更有效的方法)中效率最高的一种。
另外,这三个代码如何操作和删除内容?
我知道三种删除文件中所有条目的方法。
他们是
>filename
touch filename
filename < /dev/null
在这三个中,我滥用>filename
最多,因为这需要最少的击键次数。
但是,我想知道相对于大型日志文件和小型文件,这三种方法(如果有更有效的方法)中效率最高的一种。
另外,这三个代码如何操作和删除内容?
Answers:
实际上,第二种形式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命令需要系统打开可执行文件,加载可执行文件并运行它。
truncate
是最有效的呢?
> filename
方法需要调用的close()系统调用。
truncate(2)
不会那样做。
touch filename
,则inode会保持不变(前提是之前有文件)?
ls -i
其他选项可能是:
echo -n > filename
从手册页echo
:
-n Do not print the trailing newline character.
有一个内置命令“:”,可以在sh,csh,bash和其他命令中使用,可以与重定向输出运算符>
截断文件一起轻松使用:
#!/usr/bin/env bash
:> filename
我喜欢的是,它不需要任何外部命令,例如“ echo”等。
截断文件而不是删除/重新创建文件的一大优点是,运行与此文件一起使用的应用程序(例如,某人制作了tail -f filename
或监视软件,...)无需重新打开文件。他们只是可以继续使用filedescriptor并获取所有新数据。
man bash
将:
内置的shell 描述为无效。
>
到文件中,如果文件不存在,则会创建该文件;如果文件存在,则将其截断为零。更好的说:您使用:
不会执行任何操作,并且使用>
不会将任何内容重定向到文件并截断它。
> file
足以截断文件。您不需要任何命令,只需重定向操作符。
> filename
将无法正常工作。例如,在zsh中。但: > filename
仍然可以。
> myfile
但例如csh错误,包含:无效的null命令。
truncate -s 0 filename
呢