我是shell脚本新手。当.tar文件的数量达到10时,我试图删除目录中最旧的.tar。每次重启服务器时,我都会获得.tar文件。所以当计数达到10时,我应该删除最旧的tar文件) 。以下是代码。
var=`find /aaa/bbb/ccc/ -type f -name "wranpcaLog_*.tar" | wc -l`
echo "before loop"
echo $var
if [ ${var} -gt 10 ]
then
$ find /aaa/bbb/ccc/wranpcaLog_*.tar | head -1 | xargs rm -rf
#`find /var/opt/ericsson/nms_umts_wran_pca/ -type f -name "wranpcaLog_*.tar" | head -1`
#do
# rm -r $i
# break
# done
fi
请帮帮我 提前谢谢。
答案 0 :(得分:0)
这是logrotate
的工作。
logrotate
用于管理/var/log
中日志文件的程序。示例要遵循。它可以根据日期或大小旋转日志。
查看/etc/cron.daily/logrotate和/etc/logrotate.conf。你应该只能在/etc/logrotate.conf中输入一个条目来处理你想要旋转的文件。
另见本网站:http://www.rackspace.com/knowledge_center/article/understanding-logrotate-utility
好的,我的系统/etc/cron.daily/logrotate每天都会调用logrotate一次。 /etc/logrotate.conf告诉logrotate如何处理每个文件。所以你只需要担心修改/etc/logrotate.conf
您只需要在/etc/logrotate.conf文件中添加这样的条目。
/var/log/LOGFILENAME {
monthly
create 0664 root root
rotate 1
}
然后重新启动系统或cron,或者让更改生效。您还可以通过直接调用logrotate来测试配置文件,因此:
/usr/sbin/logrotate /etc/logrotate.conf
第一行旋转1告诉logrotate
保留一个旧副本,这样您最终会得到两个月的日志:上个月和本月。如果要保留10份文件副本,请更改旋转1以旋转10。
答案 1 :(得分:0)
保留10个文件的目的是什么?是这样你可以看到最近的重启,还是基于时间框架或......其他什么?
因为我想考虑专门使用find -mtime
:
find /aaa/bbb/ccc/ -type f -name "wranpcaLog_*.tar" -mtime +10 -exec rm {} \;
将删除10天内未修改的所有文件。 (修改味道 - 可能是1天更容易)。
这样一来,你就不会冒失去真正最近文件的风险,因为有些东西是闪闪发光的,并且重生的速度太快了。
答案 2 :(得分:0)
使用大部分代码的一种解决方案:
var=$(find /aaa/bbb/ccc/ -type f -name "wranpcaLog_*.tar" | wc -l)
echo "before loop"
echo $var
if [ ${var} -gt 10 ]
then
find /aaa/bbb/ccc/ -type f -name "wranpcaLog_*.tar -printf '%A@ %p\n' |
sort -n |
awk 'END{$1=""; sub(/^ */, ""); system("rm "$0)}'
fi
答案 3 :(得分:0)
您当前方法的弱点是没有特定的文件排序。您不一定要保留最近的10或最老的10.要做到这一点,您必须整理和排序。
所以我会想到这样的事情:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
my $files_to_keep = 10;
my $path_to_prune = "/aaa/bbb/ccc/";
my %age_of;
sub stash_recent {
next unless m/wranpcaLog_.*\.tar/;
$age_of{$File::Find::name} = -M;
}
find( \&stash_recent, $path_to_prune );
my $count = 0;
foreach my $file ( sort { $age_of{$a} <=> $age_of{$b} } keys %age_of ) {
next if $count++ < $files_to_keep;
print "Delete $file\n";
}
它将迭代您建议的路径,查找符合您规范的所有文件(递归)。选择文件年龄。 (不修改时间)并将其放入哈希%age_of
。
然后遍历该哈希中的每个元素,并保持最新的10。 (好吧,脚本实际上不会做任何事情,它只会打印 - 但那是因为我不会将删除命令嵌入到我在互联网上发布的脚本中!)。