Фильтрация имен файлов с помощью bash - PullRequest
2 голосов
/ 14 марта 2010

У меня есть каталог с файлами журналов в форме

${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 ]

3 голосов
/ 16 марта 2010

Следующий скрипт ожидает установки даты 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
2 голосов
/ 14 марта 2010

Предположительно, как файл журнала, он не будет изменен с момента его создания?

Рассматривали ли вы что-то вроде этого ...

find ./ -name "*.log.*" -mtime +60 -exec rm {} \;

для удаления файлов, которые не были изменены в течение 60 дней. Если файлы были изменены совсем недавно, это, конечно, бесполезно.

1 голос
/ 15 марта 2010

при условии, что у вас есть возможность изменить журналы, и временная метка имени файла является более точной. Вот скрипт 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*
1 голос
/ 14 марта 2010

Вам нужно сравнить дату файла журнала с текущей датой. Начните с года, умножьте на 12, чтобы получить разницу в месяцах. Сделайте то же самое с месяцами, и сложите их вместе. Это дает вам возраст файла в месяцах (в соответствии с именем файла).

Для каждого имени файла вы можете использовать AWK-фильтр для извлечения года:

awk -F. '{ print substr($3,0,4) }'

Вам также нужен текущий год:

date "+%Y"

Чтобы рассчитать разницу:

$(( current_year - file_year ))

Аналогично для месяцев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...