首页 > 解决方案 > 查找大小以上的所有文件并截断​​?

问题描述

/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

标签: linuxshell

解决方案


我建议旋转和压缩日志而不是截断它们。日志通常压缩得非常好,如果您愿意,您可以将压缩后的日志移动到备份媒体。另外,如果您确实必须删除任何内容,请删除最旧的日志,而不是最新的日志。


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

SIZE 也可以用以下修饰字符之一作为前缀:'+' 扩展,'-' 减少,'<' 最多,'>' 至少,'/' 向下舍入到倍数,'%' 舍入多达多个。

如果文件处于固定深度,则不需要循环或find调用。一个简单的 glob 就可以了:

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

如果它们处于不可预测的深度,您可以使用扩展的通配符......

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

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

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

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


推荐阅读