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

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

cat file.log


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

nano file.log


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

#1 楼

在bash中,只需

> filename


即可。

PS:如果需要sudo调用,请考虑使用此处回答的truncate

评论


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

– Blarg
2013年12月2日于16:34

相反,@ Arekkusandaa.Irujasukin;只要如上所述,只要您使用bash作为外壳程序而不是e,它就可以在任何Windows版本中正常工作。 G。 cmd.exe或PowerShell,两者都不具备POSIXy功能,无法处理此类问题。

–DopeGhoti
2015年2月5日在20:39

LInters抱怨,也许更优雅的是true> filename

– Pablo A
3月23日19:15

#2 楼

您可以使用用户命令:truncate

truncate -s 0 test.txt


(“ -s 0”指定大小)

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

评论


最好的解决方法是在非root用户(使用sudo)时起作用— sudo echo> file在这种情况下只会给出错误。

–德米特里·韦克霍图洛夫(Dmitry Verkhoturov)
15年8月19日在7:35

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

– Stuart P. Bentley
2015年9月14日19:03在

brew install在安装了自制软件的os x上截断。

–xaxxon
16年7月4日在7:47

比回声更快

–iao1007
18年11月26日在6:30

#3 楼

您可以这样做:

echo -n "" > file.log


使用>将来自echo -n的(空)输入写入文件。

使用>>将附加输入到文件的null输入(实际上只是对touch进行了任何操作)。

评论


这将在其中留出空间。

– dmckee ---前主持人小猫
2010-1-1的1:58



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

–安德鲁(Andrew)
2010-1-1的3:52

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

–戴夫·福加克
2012年5月4日19:47

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

– Stuart P. Bentley
2014年7月25日下午5:09

您可能对sudo有一些问题。

–烙饼
19年1月10日在2:44

#4 楼

: > file.log


与Bash中的> filename相同,但可在更多shell中使用(贷记)。将输出从内置的true(无输出)重定向到filename

评论


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

–亚伦·霍尔
2014-12-29 3:38



只要做:> filename。看起来像是一个笑脸吗? :>

– minmaxavg
2015年9月14日在2:37



#5 楼

ZSH

>! filename


ZSH将使用io重定向操作符>保护用户避免破坏文件。如果使用>!,则可以强制截断现有文件。

如果希望ZSH使用Bash的重定向行为,如果没有防止文件破坏的保护,则需要为shell设置clobber选项。

更多信息: http://zsh.sourceforge.net/Doc/Release/Redirection.html

#6 楼

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

vim file.txt 


按Esc键。

:1,$d


按Enter。

您将找到所有已删除的行。

评论


这是唯一适用于我的邮件日志的东西,即使sudo> / var / log / maillog也无法清除它(权限被拒绝)

– bobobobo
2014年1月16日0:00

@bobobobo不能像sudo一样工作> / var / log / maillog的意思-运行sudo,并将其输出放入文件中。显然,它以当前用户权限放置输出。做sudo su来启动root shell,然后执行> / var / log / maillog会更容易。

– kan
2014年10月1日上午10:13

#7 楼

$ rm file.log; touch file.log




$ cat > file.log


,然后control-d

或...或.. 。

啊。这是一个命令版本:

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


评论


Thechickenmoo建议的echo“”> file.log优于您显示的cat选项,在这种情况下,在其他情况下cat更合适。两者都使用相同的外壳重定向进行繁重的工作。

–嘎嘎吉qua德
2010年1月1日4:57



您不需要运行cat命令。只需“>“ file.log”即可。

– camh
2010年1月1日,下午6:22

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

–马特奥
13年7月16日在12:40

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

–robert
17年12月8日在23:21

#8 楼

下面的命令也应该起作用:

cat /dev/null > file.log


评论


我多年来一直没有错误地使用过

– MaXi32
10月13日5:58

#9 楼

如果您需要sudo的超级用户特权才能访问该文件,则接受的答案将不起作用。使用此功能确实有效:

truncate -s0 file


,或显式使用sudo:

sudo truncate -s0 file


更多信息,请访问http:// /www.commandlinefu.com/commands/view/12/empty-a-file

#10 楼

几种替代方法:

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


#11 楼

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

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


(我没有50的声誉,因此我无法将其包含在上一个答案的注释中。有时会受到限制相反的。)

#12 楼

可以使用sed

sed -i d filename
完成

评论


+1。而且您也可以使用awk来做,但这对于大型文件来说太慢了。

– Cuauhtli
6月14日20:41

#13 楼

清除文件的方法有多种,如下所示:

echo "" > filename
cat /dev/null > filename


以下示例主要用于shell脚本编写

just# > filename
: > filename


#14 楼

一次一行吗?

尝试使用vi(m)这个可爱的文本编辑器,它可以执行任何操作。
在这种情况下,导航到一行,按d(代表删除),然后再次d(用于行)。

评论


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

–巴布
2010年1月1日,下午4:19

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

–鲍勃
2014年4月4日,0:22

#15 楼

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

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


#16 楼

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

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


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

#17 楼

在Windows环境中:
type nul >filename