命令在最大计数.tar文件达到10时删除目录中最旧的.tar文件

时间:2014-11-18 12:01:10

标签: shell

我是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

请帮帮我 提前谢谢。

4 个答案:

答案 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。 (好吧,脚本实际上不会做任何事情,它只会打印 - 但那是因为我不会将删除命令嵌入到我在互联网上发布的脚本中!)。