我的目录中包含
格式的日志文件${name}.log.${year}{month}${day}
这样他们看起来像这样:
logs/
production.log.20100314
production.log.20100321
production.log.20100328
production.log.20100403
production.log.20100410
...
production.log.20100314
production.log.old
我想使用bash脚本过滤掉所有早于x月份的日志并将其转储到 * .log.old
X=6 #months
LIST=*.log.*;
for file in LIST; do
is_older = file_is_older_than_months( ${file}, ${X} );
if is_older; then
cat ${c} >> production.log.old;
rm ${c};
fi
done;
如何获取超过x个月的所有文件?和...如何避免 * .log.old 文件包含在LIST属性中?
答案 0 :(得分:3)
以下脚本需要安装GNU日期。您可以在包含日志文件的目录中使用第一个参数作为月数来调用它。
#!/bin/sh
min_date=$(date -d "$1 months ago" "+%Y%m%d")
for log in *.log.*;do
[ "${log%.log.old}" "!=" "$log" ] && continue
[ "${log%.*}.$min_date" "<" "$log" ] && continue
cat "$log" >> "${log%.*}.old"
rm "$log"
done
答案 1 :(得分:2)
据推测,作为一个日志文件,它自创建以来就不会被修改?
你有没有考虑过这样的事情......
find ./ -name "*.log.*" -mtime +60 -exec rm {} \;
删除60天未修改的文件。如果文件最近被修改过,那么这当然没有用。
答案 2 :(得分:1)
您必须将日志文件日期与当前日期进行比较。从年份开始,乘以12得到月份的差异。几个月一样,并将它们加在一起。这将以月为单位为您提供文件的年龄(根据文件名)。
对于每个文件名,您可以使用AWK过滤器来提取年份:
awk -F. '{ print substr($3,0,4) }'
您还需要当年:
date "+%Y"
计算差异:
$(( current_year - file_year ))
同样数月。
答案 3 :(得分:1)
假设您有可能修改日志,文件名时间戳更准确。这是一个gawk脚本。
#!/bin/bash
awk 'BEGIN{
months=6
current=systime() #get current time in sec
sec=months*30*86400 #months in sec
output="old.production" #output file
}
{
m=split(FILENAME,fn,".")
yr=substr(fn[m],0,4)
mth=substr(fn[m],5,2)
day=substr(fn[m],7,2)
t=mktime(yr" "mth" "day" 00 00 00")
if ( (current-t) > sec){
print "file: "FILENAME" more than "months" month"
while( (getline line < FILENAME )>0 ){
print line > output
}
close(FILENAME)
cmd="rm \047"FILENAME"\047"
print cmd
#system(cmd) #uncomment to use
}
}' production*