![清空文件内容的最有效方法](https://linux22.com/image/46080/%E6%B8%85%E7%A9%BA%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E7%9A%84%E6%9C%80%E6%9C%89%E6%95%88%E6%96%B9%E6%B3%95.png)
我知道三种方法可以从文件中删除所有条目。
他们是
>filename
touch filename
1filename < /dev/null
在这三个中,我滥用得>filename
最多,因为这需要最少的击键次数。
但是,我想知道对于大日志文件和小文件来说,这三种方法中哪一种最有效(如果有更有效的方法)。
还有,这三个代码是如何操作和删除内容的呢?
1编辑: 如中所讨论的这个答案,这实际上才不是清除文件!
答案1
实际上,第二种形式touch filename
不会从文件中删除任何内容 - 如果文件不存在,它只会创建一个空文件,或者更新现有文件的上次修改日期。
第三个filename < /dev/null
尝试运行 filename/dev/null
作为输入。
cp /dev/null filename
作品。
至于效率,最有效的是truncate -s 0 filename
(参见这里)。
否则,cp /dev/null filename
或者> filename
两者都很好。它们都使用打开时截断设置打开然后关闭文件。 cp
也会打开/dev/null
,因此速度会稍微慢一些。
另一方面,truncate
可能会比> filename
从脚本运行时慢,因为运行 truncate 命令需要系统打开可执行文件,加载它,然后运行它。
答案2
其他选项可能是:
echo -n > filename
从手册页echo
:
-n Do not print the trailing newline character.
答案3
有一个内置命令“:”,可能在 sh、csh、bash 等中可用,可以轻松地与重定向输出运算符>
截断文件一起使用:
#!/usr/bin/env bash
:> filename
我喜欢的是,它不需要任何外部命令,如“echo”等。
截断文件而不是删除/重新创建文件的一大优点是,运行与该文件配合使用的应用程序(例如,有人制作了一个tail -f filename
或一个监视软件,...)不必重新打开它。他们可以继续使用文件描述符并获取所有新数据。