使用bash过滤文件名

时间:2010-03-14 17:46:48

标签: bash shell

我的目录中包含

格式的日志文件
${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属性中?

4 个答案:

答案 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*