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

他们是


>filename
touch filename
filename < /dev/null

我最滥用>filename所需的击键次数最少。

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

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

评论

截断-s 0文件名怎么办?

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

第一个仅在从bash命令行调用时才有效,但是如果在.sh文件中执行则不起作用

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

#1 楼

实际上,第二种形式touch filename不会从文件中删除任何内容-它只会在一个不存在的情况下创建一个空文件,或者更新现有文件的最后修改日期。
第三种形式filename < /dev/null会尝试运行以/dev/null作为输入的文件名。
cp /dev/null filename可以工作。
关于效率,最有效的是truncate -s 0 filename(请参见此处)。他们都使用“打开时截断”设置打开然后关闭文件。 cp /dev/null filename还会打开> filename,这样会使它稍微慢一些。然后运行它。

评论


那么,为什么说截断是最有效的呢?

–StéphaneChazelas
13年8月30日在6:24

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

–灰
13年8月30日在6:26

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

–StéphaneChazelas
13年8月30日在8:01



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

– pMan
13年8月30日在8:30

@pMan是的,您可以尝试一下并用ls -i检查

– terdon♦
13年8月30日在13:02

#2 楼

其他选项可能是:

echo -n > filename


echo的手册页中:


-n Do not print the trailing newline character.


评论


如何设置尺寸?说我要30000个空字符吗?

–用户
16 Nov 16在23:52



#3 楼

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

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


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

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

评论


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

– Haxiel
18/12/3在10:06

是的,然后使用> in将其重定向到文件,如果文件不存在,则会创建该文件;如果文件存在,则将其截断为零。最好说:您可以使用:而不执行任何操作,并使用>将任何内容都重定向到文件并截断​​它。

– Mirko Steiner
18/12/3在10:10

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

– terdon♦
18/12/3在11:12

有时,>文件名将不起作用。例如,在zsh中。但是:> filename仍然有效。

–贝CS铭
18/12/5在16:19

Bash和sh似乎喜欢> myfile,但例如csh错误:无效的null命令。

– Mirko Steiner
18/12/12在15:33