Como apagar os arquivos em uma pasta com mais de 60 dias no UNIX?

1

Eu sei como excluir os arquivos com mais de 60 dias por hora de modificação, mas desejo excluir arquivos com base em um registro de data e hora no nome do arquivo.

Por exemplo, eu tenho os arquivos abaixo para cada dia mensalmente, e tenho esses arquivos nos últimos 3 anos.

vtm_data_12month_20140301.txt
vtm_data_12month_20140301.control
vtm_mtd_20130622.txt
vtm_mtd_20130622.control
vtm_ytd_20131031.txt
vtm_ytd_20131031.control

Gostaria de escrever um script para encontrar todos os arquivos com mais de 60 dias (com base no nome do arquivo) e excluí-los, exceto o último arquivo de cada mês. Por exemplo, em janeiro, quero excluir todos, exceto vtm_data_12month_20140131.txt . A questão aqui é que há uma chance de ter arquivos recebidos para 30 de janeiro, então, nesse caso, não devo excluir o arquivo mais recente, mas preciso excluir o restante.

Por favor me avise como posso conseguir isso via script de shell?

    
por Vamsi Krishna 27.11.2014 / 05:37

4 respostas

2

OK, refiz este script e, classificando-o de trás para frente, parece que deve funcionar. Ele compara o ano e o mês com o anterior e, se for menor, deve ser a última entrada desse mês.

#!/bin/bash

#the tac reverses the listing, so we go from newest to oldest, vital for our logic below
FILES='ls | tac'

#create a cutoff date by taking current date minus our 60 day limit
CUTOFFDATE='date --date="60 days ago" +%Y%m%d'

#we are setting this value to month 13 of the current year 
LASTYEARMONTH='date +%Y'13

for file in $FILES; do

    #get datestamp
    FILEDATE='expr match "$file" '.*\(20[0-9][0-9][0-9][0-9][0-9][0-9]\)''

    #get year and month, ie 201410
    THISYEARMONTH=${FILEDATE:0:6}

    if [ ! -z $FILEDATE ] && [ $THISYEARMONTH -lt $LASTYEARMONTH ]; then

            echo "$file IS THE LAST FILE OF THE MONTH. NOT DELETING"

    else

            #now we see if the file is older than 60 days (ie, has a LOWER unix timestamp than our cutoff)
            if [ ! -z $FILEDATE ] && [ $FILEDATE -lt $CUTOFFDATE ]; then

                    echo "$file has a file date of $FILEDATE which is older than 60 days."

                    #uncomment this next line to remove
                    #rm $file
            fi
    fi
    LASTYEARMONTH=$THISYEARMONTH
done
    
por 27.11.2014 / 09:25
0

O código a seguir não preserva o último arquivo de cada mês.

#! /bin/bash

cmp_timestamp=$(date --date="60 days ago" +%Y%m%d)

while read filename; do
        [[ $filename =~ _(20[0-9][0-9][01][0-9][0123][0-9])\. ]]
        timestamp=${BASH_REMATCH[1]}
        printf "%-40s : %s\n" "$filename" "${timestamp}" 
        if [ "$timestamp" -lt "$cmp_timestamp" ]; then
                echo "   delete this file"
                : rm "$filename"
        else
                echo "   DO NOT delete this file"
        fi
        echo
done <file

De man bash :

BASH_REMATCH
An array variable whose members are assigned by the =~ binary operator to
the [[ conditional command.  The element with index 0 is the portion of the
string  matching  the entire regular expression.  The element with index n
is the portion of the string matching the nth parenthesized subexpression.
This variable is read-only.
    
por 27.11.2014 / 07:19
0

Você pode tentar isso em loop:

#!/bin/bash
A=vtm_data_12month_20140301.txt
B='ls vtm_data_12month_20140301.txt  | awk -F "_" '{print $4}' | awk -F "." '{print $1}''
C='date --date="60 days ago" +%Y%m%d'
if [ "$B" <  "$C" ]
then
   rm -fr $A
else
   echo "$A is not older"
fi
    
por 27.11.2014 / 09:10
0

Abaixo, o script python faz o trabalho, dias a partir dos quais os arquivos devem ser excluídos podem ser configurados com days variable.

#!/usr/bin/env python3

import os
import re
import datetime

days=60

delta = datetime.date.today() - datetime.timedelta(days=days)
files = [ x for x in os.listdir() if re.search('_\d{8}\.', x)]

for file in files:
    date = re.search('_(\d{8})\.', file).group(1)
    if datetime.datetime.strptime(date, '%Y%m%d').date() <= delta:
        print('Removing file: ',file)
        os.remove(file)

Saída:

$ ./remove.py 
Removing file:  vtm_data_12month_20140301.txt
Removing file:  vtm_mtd_20130622.control
Removing file:  vtm_data_12month_20140301.control
Removing file:  vtm_mtd_20130622.txt
Removing file:  vtm_ytd_20131031.txt
Removing file:  vtm_ytd_20131031.control
    
por 27.11.2014 / 12:26