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

And*_*rew 376 linux command-line

我有一个日志文件,里面有一堆我不再需要的东西。我想清除内容。

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

cat file.log
Run Code Online (Sandbox Code Playgroud)

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

nano file.log
Run Code Online (Sandbox Code Playgroud)

但我不想一次删除每一行。有没有办法在不破坏文件的情况下在一个命令中完成它?

gee*_*eek 602

在 bash 中,只需

> filename
Run Code Online (Sandbox Code Playgroud)

会做。这将为您留下一个空文件filename

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

  • 这可能是计算史上最牛逼的命令 (80认同)
  • 相反,@Arekkusandaa.Irujasukin;它在任何版本的 Windows 中都可以正常工作,只要如上所述,您使用 `bash` 作为 shell 而不是例如 `cmd.exe` 或 PowerShell,它们都不是 POSIXy 足以处理这些事情. (8认同)
  • 这很花哨而且简短,但它确实有一些缺点。首先,如何处理文件权限(例如“sudo”的需要)并不是很明显。当然,您可以使用 `sudo bash -c '> filename'` 来完成此操作,但生成 shell 的成本(相对)昂贵。其次,它很容易使交互式 shell 崩溃,而这些 shell 实际上会挂起等待输入。如果您想将脚本的某些部分复制到终端并获得相同的结果,这一点尤其重要。由于这些原因,我建议基于 [`truncate` 的答案](https://superuser.com/a/634217/33767) 实际上更稳健。 (3认同)
  • LInters 抱怨,也许更优雅的是 `true > filename` (2认同)

小智 183

您可以使用用户命令:truncate

truncate -s 0 test.txt
Run Code Online (Sandbox Code Playgroud)

(“-s 0”指定大小)

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

  • @DmitryVerkhoturov:`sudo bash -c '> filename'` 是你如何使用带有 sudo 的 Bash 解决方案。 (13认同)
  • 最佳答案,当您是非 root 用户(使用 sudo)时有效——`sudo echo > file` 在这种情况下只会给出错误。 (4认同)

小智 43

你可以这样做:

echo -n "" > file.log
Run Code Online (Sandbox Code Playgroud)

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

Using>>会将空输入附加到文件中(实际上除了touching 它什么都不做)。

  • echo "" > 仍然会给你一个带有一个字符(换行符)的文件。如果你想使用 echo,使用 "echo -n > file.log" 来回显 null。 (5认同)

Stu*_*ley 40

: > file.log
Run Code Online (Sandbox Code Playgroud)

> filenameBash相同,但适用于更多 shell (信用)。将输出从true内置(没有输出)重定向到filename.

  • 只需执行`:> 文件名`。看起来不像笑脸吗?:> (8认同)

小智 14

ZSH

>! filename
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 10

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

vim file.txt 
Run Code Online (Sandbox Code Playgroud)

Esc

:1,$d
Run Code Online (Sandbox Code Playgroud)

Enter

你会发现所有的行都被删除了。

  • @bobobobo 它不起作用,因为`sudo > /var/log/maillog` 意味着 - 运行 sudo,并将其输出放入文件中。显然,它使用当前用户权限放置输出。更简单的事情是做`sudo su` 来启动root shell,然后做`> /var/log/maillog`。 (2认同)

dmc*_*ten 6

$ rm file.log; touch file.log
Run Code Online (Sandbox Code Playgroud)

或者

$ cat > file.log
Run Code Online (Sandbox Code Playgroud)

其次是control-d

或者……或者……或者……

啊。这是单个命令版本:

$ dd if=/dev/null of=file.log
Run Code Online (Sandbox Code Playgroud)

  • Thechickenmoo 对 `echo "" > file.log` 的建议比你展示的 `cat` 选项更好,在这种情况下,还有其他的 `cat` 更合适。两者都使用相同的外壳重定向来完成繁重的工作。 (2认同)
  • 您不需要运行 cat 命令。只需“> file.log”即可。 (2认同)

小智 6

下面的命令也应该工作:

cat /dev/null > file.log
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最好的兼容答案,因为“truncate”不像 MacOS 那样内置在 BSD 中,而且“bash”也不是某些操作系统的默认 shell。 (3认同)

tim*_*ith 5

如果您需要 sudo 超级用户权限才能访问该文件,那么接受的答案将不起作用。使用这个确实有效:

truncate -s0 file
Run Code Online (Sandbox Code Playgroud)

或明确使用 sudo:

sudo truncate -s0 file
Run Code Online (Sandbox Code Playgroud)

更多信息请点击这里http://www.commandlinefu.com/commands/view/12/empty-a-file