linux - 查找大小以上的所有文件并截断?
问题描述
/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
解决方案
我建议旋转和压缩日志而不是截断它们。日志通常压缩得非常好,如果您愿意,您可以将压缩后的日志移动到备份媒体。另外,如果您确实必须删除任何内容,请删除最旧的日志,而不是最新的日志。
也就是说,出于教育目的,让我们探索一下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
但要防止这种可能性。)
推荐阅读
- c# - 如何将 Label.Text 转换为数字
- google-colaboratory - 在 colab 中从 Roboflow 加载数据集
- javascript - 是否可以旋转 iframe,然后分别旋转其中的内容,以实现底部滚动条的效果?
- azure - 是否可以创建具有特定 IP 地址的公共 ip?
- docker - 将 nginx 重定向到 ssl docker 服务
- android - 如何在活动中获取 navController?
- database - 使用 IOTDB 时 UDTF 在集群模式下不起作用
- postgresql - 如何对 MySQL 中多个日期的前 n 天求和
- r - R计算相关系数
- javascript - 在导航返回时从缓存中提供页面