查找所有超过大小的文件并截断​​?

时间:2020-06-10 16:09:26

标签: linux shell

/home目录下具有各种客户帐户的服务器上运行cPanel。 许多客户的error_log文件超出了期望的大小(例如100MB),我想创建一个cron作业来每天运行以截断一定大小的任何文件。

我知道truncate可以缩小文件,但是如果文件小于规定的数量,它将扩展文件,所以下面的解决方案(首先找到大于所需大小的所有文件,然后缩小它们)最有意义,并且会能行吗?

for i in $(find /home -type f -iname error_log -size +99M); do
    truncate -s 100M $i
done

2 个答案:

答案 0 :(得分:4)

我建议rotating and compressing logs,而不是将其截断。日志通常可以很好地压缩,并且您可以根据需要将压缩后的日志移至备份介质。另外,如果您必须删除任何内容,请删除最旧的日志,而不是最新的日志。


也就是说,出于教育目的,让我们探索truncate。尽管它被埋藏在文档中,但它只能收缩文件:

SIZE可能还带有以下修饰字符之一:'+'扩展,'-'缩减,'<<至多,'>'至少,'/'向下舍入为' %'四舍五入为整数。

如果文件的深度固定,则不需要循环也不需要find调用。一个简单的glob可以做到:

truncate -s '<100M' /home/*/path/to/error_log

如果它们的深度不可预测,则可以使用扩展的globbing ...

shopt -s extglob
truncate -s '<100M' /home/**/error_log

...或者使用find -exec <cmd> {} +,它告诉find在找到的文件上调用命令。

find /home -name error_log -exec truncate -s '<100M' {} +

(如果有很多文件find是最安全的。glob选项可能会超过Linux的命令行长度限制,而find会避免这种可能性。)

答案 1 :(得分:1)

  • 请勿使用for i in $(...)。它将在空白处中断。
  • 始终引用您的变量扩展名。做"$i"
  • find-exec,只需使用它即可。

所以:

find /home -type f -iname error_log -size +99M -exec truncate -s 100M {} \;
相关问题