在Linux使用truncate截短文件

在某些情况下,您可能希望将现有文件截短,即减少文件的大小。简单来说,截短文件意味着删除文件内容而不删除文件

3 min read
By myfreax
在Linux使用truncate截短文件

在某些情况下,您可能希望将现有文件截短,即减少文件的大小。简单来说,截短文件意味着删除文件内容而不删除文件。截短文件比删除文件重新创建并设置正确的权限和所有权,更快,更容易。

另外,如果文件是由进程打开的,如果此时你删除文件可能会导致使用该文件的程序出现故障。但你可以尝试将文件截短。

本教程说明了如何在Linux系统中使用shell重定向和truncate命令将文件截短。包括使用: > filename命令,使用/dev/null设备输出的重定向,当没有写文件权限可以是使用sudo和tee命令重定向空字符串到文件,使用truncate命令截短到指定的大小,批量清空日志文件。

Shell重定向

截短文件最简单,最常用的方法是使用 Shell重定向操作符>。使用重定向截短文件的一般格式为:

: > filename

让我们理解一下命令,:冒号表示true,不产生任何输出。重定向操作符>将先前命令的输出重定向到指定文件。filename,您要截短的文件。如果文件存在,它将被截短为零,即空文件。否则,将创建文件。

除了:以外,还可以使用另一个不产生任何输出的命令。以下是使用cat命令输出/dev/null设备内容的示例设备/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中执行命令。以下命令将创建一个sh shell的实例,运行> filename命令:

sudo sh -c '> filename'

另一个选择是将输出传递给tee命令,使用sudotee命令的权限提升为root,然后将空输出写入指定文件:

: | 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中截断文件,请使用重定向操作符>,后跟文件名或者使用truncate命令。如果您有任何疑问或意见,请在下面发表评论。