他们是
>filename
touch filename
filename < /dev/null
我最滥用
>filename
所需的击键次数最少。 但是,我想知道对于大型日志文件和小型文件,这三种方法(如果有更有效的方法)中最有效的方法。
另外,这三个代码如何操作和删除内容?
#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
评论
截断-s 0文件名怎么办?与cat和'>'之间的区别非常相似,可以将文件归零,您可以在其中找到更多信息。
第一个仅在从bash命令行调用时才有效,但是如果在.sh文件中执行则不起作用
touch不会删除内容,但会更改文件的访问时间。如果不存在,它将创建一个空文件。