如何在 Linux 中清空文件

在某些情况下,您可能希望将现有文件清空为零长度。简单来说,清空文件意味着删除文件内容而不删除文件。

删除文件重新创建文件以及设置正确的权限和所有权相比,清空文件要快得多,也容易得多。另外,如果文件是由进程打开的,则删除该文件可能会导致使用该文件的程序出现故障。

本教程说明了如何在 Linux 系统中使用 Shell 重定向和 truncate 命令将文件清空为零大小。

shell 重定向

清空文件最简单,最常用的方法是使用 Shell 重定向运算符 >

使用重定向清空文件的一般格式为:

: > filename

让我们分解一下命令:

  • : 冒号意味着 true 和不产生任何输出。
  • 重定向运算符 > 将先前命令的输出重定向到给定文件。
  • filename,要清空的文件。

如果该文件存在,它将被清空为零。否则,将创建文件。

代替 : 还可以使用另一个不产生任何输出的命令。

这是使用 cat 命令输出 /dev/null 设备内容的示例,该设备仅返回文件结尾字符:

cat /dev/null > filename

可以使用的另一个命令是 echo 。该 -n 选项告诉 echo 不要添加换行符:

echo -n > filename

在大多数现代的 Shell( 例如 Bash 或 Zsh) 上,您可以在重定向符号之前省略该命令,并使用:

> filename

为了能够清空文件,您需要对该文件具有写权限。通常,您将使用 sudo 权限,但是提升的 root 特权不适用于重定向。这是一个例子:

sudo : > /var/log/syslog
bash: /var/log/syslog: Permission denied

有几种解决方案允许 sudo 使用重定向。第一个选项可以使用 sudo 运行新的 shell ,并使用 -c 标志在该 shell 中执行命令:

sudo sh -c '> filename'

另一个选择是将输出传递给 tee 命令,使用 sudo 提升 tee 的权限,并将空输出写入给定文件:

: | sudo tee filename

truncate 命令

truncate  是一个命令行实用程序,可让您将文件的大小缩小或扩展到给定的大小。

使用 truncate 命令将文件清空为零大小的一般语法如下:

truncate -s 0 filename

-s 0 选项将文件大小设置为零。

例如,要清空 Nginx 访问日志,可以使用:

sudo truncate -s 0 /var/log/nginx/access.log

清空所有日志文件

随着时间的流逝,您的磁盘驱动器可能会被大量占用大量磁盘空间的大型日志文件所困扰。

以下命令将清空 /var/log 目录下以 “ .log” 结尾的文件:

sudo truncate -s 0 /var/log/**/*.log

更好的选择是使用该 logrotate 工具压缩和删除日志文件。

结论

要在 Linux 中清空文件,请使用重定向操作符, > 后跟文件名。