Como deletar 2 meses de volta arquivos no unix

3

Digamos que eu tenha arquivos de log abaixo,

AA_XX_20130719185428.log
exec_xxx_cpb_20130712182453.log
13122013121327_AR_INC_DOBC_1.dprf.log
24122013_masterscript.LOG

A parte da data contém data e hora.

Eu quero excluir todos os arquivos de 2 meses anteriores.

Eu não quero excluir o arquivo com base na data da última modificação, mas com base na data incluída no nome do arquivo. As datas podem estar em qualquer um desses formatos:

  • YYYYmmddHHMMSS
  • ddmmYYYYHHMMSS
  • ddmmYYYY.

Como posso excluir os arquivos usando o shell script?

    
por pankaj 30.12.2013 / 09:18

3 respostas

2

Você pode usar o script a seguir. Chame com nomes de arquivos para testar e excluir como argumentos.

#!/usr/bin/env python
# encoding: utf-8

import os
import sys
import datetime

test_file_names = [x for x in """\
AA_XX_20130719185428.log
exec_xxx_cpb_20130712182453.log
13122013121327_AR_INC_DOBC_1.dprf.log
24122013_masterscript.LOG
""".split('\n') if x.strip()]

# appr. 2 meses
two_months = datetime.date.today() - datetime.timedelta(days=61)

testing = len(sys.argv) < 2
if testing:
    file_names = test_file_names
else:
    file_names = sys.argv[1:]

allow_datetime = set([
    len('YYYYmmddHHMMSS'),
    len('ddmmYYYYHHMMSS'),
    len('ddmmYYYY'),
])

for file_name in test_file_names:
    for part in os.path.splitext(os.path.basename(file_name))[0].split('_'):
        if len(part) not in allow_datetime:
            continue
        for ch in part:
            if not ch.isdigit():
                break
        else:
            dt = part
            if dt[4:6] == '20':  # ddmmYYYY
                yy = int(dt[4:8])
                mm = int(dt[2:4])
                dd = int(dt[:2])
            else:  # YYYYmmdd
                yy = int(dt[:4])
                mm = int(dt[4:6])
                dd = int(dt[6:8])
            try:
                d = datetime.date(yy, mm, dd)
            except ValueError:
                print 'wrong date', yy, mm, dd
                raise
            if testing:
                print '{:<6s} {:<40s} {}'.format(
                    'remove' if d < two_months else ' ', file_name, repr(d))
            elif d < two_months:
                print 'removing', file_name
                os.remove(file_name)
    
por 30.12.2013 / 11:42
0

Se você estiver usando o GNU date , você pode aproveitar suas habilidades de manipulação de data:

#!/usr/bin/env bash

## Define the age limit
lim=$(date -d "2 months ago" +%s); 

## Find all files in the current directory and
## sub directories
find . -type f | 

## Extract the longest string of numbers (we assume that is the date)
## and change mmdd to ddmm
perl -lne '
    ## skip file names that don't have enough numbers 
    /(\d{1,8})/ || next; $d=$1;
    next unless $d;
    ## Change YYYYmmddHHMMSS to mm/dd/YYY 
    if($d=~/201\d$/){$d=~s|(\d{2})(\d{2})(\d{4})|$2/$1/$3|}

    ## Change  ddmmYYYYHHMMSS or ddmmYYYY to mm/dd/YYY 
    else{$d=~s|(\d{4})(\d{2})(\d{2})|$2/$3/$1|}; 

    ## Print the original file name and the modified date string
    print "$_ $d" if 
' | 

## Read the file name into $f and the date into $d
while read f d; do 
## If this date is older than $lim, delete the file
 if [ "$(date -d "$d" +%s)" -lt "$lim" ]; then 
   rm "$f"; 
 fi
done

Isso pode ser condensado em um "one-liner" que você pode copiar / colar diretamente no terminal:

lim=$(date -d "2 months ago" +%s); 
find . -type f | perl -lne '
 /(\d{1,8})/ || next; $d=$1; 
 if($d=~/201\d$/){$d=~s|(\d{2})(\d{2})(\d{4})|$2/$1/$3|}
 else{$d=~s|(\d{4})(\d{2})(\d{2})|$2/$3/$1|}; print "$_ $d"' | 
while read f d; do [ "$(date -d "$d" +%s)" -lt "$lim" ] && echo rm "$f";   done

CAVEATS: Esta solução assume que os nomes dos arquivos não contêm espaços e que a maior cadeia de dígitos no nome do arquivo será sempre a data.

    
por 30.12.2013 / 18:49
-2
find . -type f -mtime +60 -exec rm -f {} \;

O -mtime está usando o tempo de modificação do arquivo

find . -type f -atime +60 -exec rm -f {} \;

O -atime usa o tempo de acesso

também com ls -lc você pode ver para o tempo de criação do inode. Isso muda quando os dados do inode são atualizados como em chmod, chown ou chgrp, por exemplo.

    
por 30.12.2013 / 09:25