Excluindo arquivos com mais de um mês [duplicado]

2

É necessário excluir todos os subdiretórios com um mês de idade. Mas, no último dia do mês, os dados devem ser ignorados nos três meses anteriores.

O data representation é o seguinte:

bkp_01102014  bkp_04102014  bkp_07102014  bkp_11102014  bkp_15112014  
...................
...................
bkp_24112014  bkp_27112014  bkp_30062014  bkp_31072  bkp_20092014

Como automatizar isso usando find ou qualquer outro comando?

    
por Zama Ques 08.12.2014 / 10:56

2 respostas

1

Acho que você não precisa renomear os arquivos. Você pode transformar os nomes dos arquivos na hora (primeiro sed), compará-los a uma data (awk) e transformar os nomes de arquivos correspondentes de volta (segundo sed).

find parent/directory -maxdepth 1 -type d -name 'bkp_*'                | \
sed 's#parent/directory/bkp_\(..\)\(..\)\(....\)##'              | \
awk -v date=$(date --date='3 months ago' +%Y%m%d) '$0<$date{print $0}' | \
sed 's#\(....\)\(..\)\(..\)#parent/directory/bkp_#'              | \
xargs rm -r

Você deve testar isso sem a parte xargs rm primeiro!

    
por 08.12.2014 / 15:57
1

Tentou escrever um script Bash. Por favor, verifique se isso pode ajudá-lo.

#!/bin/bash

NOW='date +%s'

last_day()
{
case $MM in
    01|03|05|07|08|10|12 )
    echo "31" ;;
    04|06|09|11 )
    echo "30" ;;
    02 )
    echo "28" ;;
esac
}

for file in 'ls -1 bkp*'
do
#   echo $file
    DATE='echo $file | tr -cd [0-9]' # Extract Day of the Month from file name
    YY='echo $DATE | cut -c5-8' # Extract Year from file name
    MM='echo $DATE | cut -c3-4' # Extract Month of Year fro file name
    DD='echo $DATE | cut -c1-2'
    FDATE='echo ${YY}${MM}${DD}' # Re-arrange the date
    FDATE='date +%s -d $FDATE' # Date in terms of seconds
#   echo "FILEDATE= $FDATE"
    DIFF='echo "$NOW - $FDATE" | bc' # Difference between NOW and FILEDATE in Seconds
#   echo "DIFF FROM NOW= $DIFF"
    DIFFDAYS='echo "$DIFF / 86400" | bc' # Difference in terms of DAYS
    DIFFMONTHS='echo "$DIFFDAYS / 30" | bc' # Difference in terms of MONTHS
#   echo "DIFF IN DAYS= $DIFFDAYS"
#   echo "DIFF IN MONTHS = $DIFFMONTHS" 
    LASTDAY=$(last_day $MM) # To determine whether it is a last day of month
#   echo $LASTDAY

if [ $DIFFMONTHS -ge 1 ]
then
    if [ $DD -eq $LASTDAY -a $DIFFMONTHS -ge 4 ]
    then
        rm -rf $file
    else
        rm -rf $file
    fi
fi
done

Saída de teste:

Antes de executar o script:

$ ls
bkp_20082013  bkp_20082014  bkp_20112014
bkp_20071989  bkp_20092014  bkp_30112014
bkp_20072014  bkp_20102014  bkp_31102014

Depois de executar o script:

bkp_20112014  bkp_30112014
    
por 08.12.2014 / 17:21

Tags