如何从命令行清除文件内容?


280

我有一个日志文件,其中包含很多不再需要的东西。我想清除内容。

我知道如何将内容打印到屏幕上:

cat file.log

我知道如何逐行编辑文件:

nano file.log

但是我不想一次删除每一行。有没有一种方法可以在不破坏文件的情况下用一个命令执行该操作?

Answers:


465

在bash中,

> filename

会做。

这将为您留下一个空的文件filename

ps

如果你需要sudo打电话,请考虑使用truncate在这里找到答案


57
这可能是计算历史上最可靠的命令
blarg

7
相反,@ Arekkusandaa.Irujasukin; 只要在Windows的任何版本中,它都可以正常工作,只要如上所述,您使用的bash是Shell而不是eg cmd.exe或PowerShell,它们都不是POSIXy足以应付此类问题。
DopeGhoti'2

124

您可以使用用户命令:truncate

truncate -s 0 test.txt

(“ -s 0”指定大小)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
最好的答案是,当您不是root用户(使用sudo)时有效- sudo echo > file在这种情况下只会给出错误。
德米特里·韦克霍图洛夫

12
@DmitryVerkhoturov:这sudo bash -c '> filename'是您如何在sudo中使用Bash解决方案。
Stuart P. Bentley

1
brew install truncate在装有自制软件的OS X上。
xaxxon

比回声工作更快
Miao1007 '18

34

您可以这样做:

echo -n "" > file.log

使用>从写(空)输入echo -n到文件中。

使用>>会将空输入追加到文件中(实际上只是touch对其进行任何操作)。


这将在其中留出空间。
dmckee'1

我得到这个:-bash:找不到命令
安德鲁

3
echo“”>仍会为您提供一个字符的文件(换行符。)如果要使用echo,请使用“ echo -n> file.log”来回显null。
戴夫·福加克

最好使用专用的null输出命令,例如true(或它的内置别名:),尽管最终您根本不需要命令(请参见接受的答案)。
Stuart P. Bentley

您可能会遇到一些问题sudo
弗拉杰克

27
: > file.log

> filenameBash中的相同,但可在更多shell中使用(信用)。将输出从true内置(没有输出)重定向到filename


我来回答这个问题,但是可惜它已经在这里了……请接受投票。
亚伦·霍尔

5
做吧:> filename。看起来像是一个笑脸吗?:>
minmaxavg


8

如果要在命令行的vim编辑器中执行此操作,可以尝试以下操作:

vim file.txt 

Esc

:1,$d

Enter

您会发现所有行均已删除。


这是唯一对我maillogsudo > /var/log/maillog
有用的

2
@bobobobo它不起作用sudo > /var/log/maillog-运行sudo,并将其输出放入文件中。显然,它以当前用户权限放置输出。做sudo su起来比较容易,先启动root shell然后再做> /var/log/maillog
2014年

4
$ rm file.log; touch file.log

要么

$ cat > file.log

其次是control-d

或...或...或...

啊。这是一个命令版本:

$ dd if=/dev/null of=file.log

2
Thechickenmoo的建议echo "" > file.logcat您显示的选项要好,在这种情况下,还有其他cat更合适的选择。两者都使用相同的外壳重定向进行繁重的工作。
quack quixote 2010年

2
您不需要运行cat命令。只需“>“ file.log”即可。
卡姆(Camh)2010年

删除文件将重置创建日期。
Matteo

删除该文件将导致监视该文件的程序失去指向该文件的指针(即,该文件在文件系统中将具有新地址)。一般来说,yes rm将完成产生具有相同名称的空文件的任务。但这并不适合每个用例。
罗伯特



1

几种选择:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

如果文件名中有空格,请使用:

for file in /path/to/file/*; do > "$file"; done

(我无法在以前的答案中添加评论,因为我没有50个声誉。有时限制会适得其反。)


0

一次一行?

尝试使用vi(m),它可以执行任何操作。在这种情况下,导航到一行,按d(代表删除),然后再按d(代表一行)。


5
如果要删除vim中的整个文件,将光标放在文档顶部,请输入d G(即d,然后按shift-G)将删除整个文件(d表示删除,G表示结尾)。文件)。不过,我更喜欢您的方法(它使我有更多时间考虑我是否真的要删除文件)。
巴布(Babu)2010年

@Babu gg移至顶部,因此整个序列可以为ggdG
鲍勃

0

经我许可,这是唯一有效的方法:

touch temp.txt
sudo mv temp.txt original-file.txt

0

另外,如果您有多个文件,则可以使用以下文件:

for file in /path/to/file/*; do > $file; done

这对于同一目录中的日志文件很有用。


0

> a.txt

与Bash中的> filename相同,但可在更多shell中使用(信用)。将输出从真正的内置文件(没有输出)重定向到filename。

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.