如何在Linux中截断(空)文件
在某些情况下,我们可能希望将现有文件截断(空)为零长度。
简而言之,截断文件意味着删除文件内容而不删除文件。
与删除文件,重新创建文件以及设置正确的权限和所有权相比,截断文件要快得多,也容易得多。
另外,如果文件是通过进程打开的,则删除该文件可能会导致使用该文件的程序出现故障。
本教程说明了如何在Linux系统中使用Shell重定向和'truncate'命令将文件截断为零大小。
shell重定向
截断文件最简单,最常用的方法是使用'>'shell重定向操作符。
使用重定向截断文件的一般格式为:
: > filename
让我们分解一下命令:
- ':'冒号表示'true',不产生任何输出。
- 重定向运算符'>'将前面命令的输出重定向到给定文件。
- 'filename',我们要截断的文件。
如果文件存在,它将被截断为零。
否则,将创建文件。
除了“:”以外,还可以使用其他不产生任何输出的命令。
这是使用'cat'命令输出'/dev/null'设备内容的示例,该设备仅返回文件结 tail字符:
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 -s 0 filename
-s 0选项将文件大小设置为零。
例如,要清空Nginx访问日志,可以使用:
sudo truncate -s 0 /var/log/nginx/access.log
清空所有日志文件
随着时间的流逝,磁盘驱动器可能会被大量占用大量磁盘空间的大型日志文件弄得一团糟。
以下命令将清空“/var/log”目录下以“ .log”结 tail的文件:
sudo truncate -s 0 /var/log/**/*.log
更好的选择是使用“ logrotate”工具旋转,压缩和删除日志文件。