Remove diretórios antigos de acordo com o nome do diretório?

1

No meu script bash eu crio um diretório a cada mês para backups da seguinte forma:

DAY=$(date -d "$D" '+%d')
MONTH=$(date -d "$D" '+%m')
YEAR=$(date -d "$D" '+%Y')

mkdir -p /var/app/backup/$DAY$MONTH$YEAR

Por exemplo, recebo:

 01012000
 01022000
 01032000
 .
 .
 01012014
 01022014
 01032014
 01042014
 .
 .

Depois de anos, queremos remover os diretórios com mais de metade do ano. Por exemplo, os diretórios de 01012000 até 01062000 devem ser removidos em 1/1/2015.

Qual é a melhor abordagem (do script bash) para remover os diretórios com mais de meio ano, considerando que temos a data no nome do diretório?

    
por maihabunash 02.12.2014 / 05:16

3 respostas

2

Você pode converter o nome do arquivo em algo que possa ser comparado diretamente (como o carimbo de data / hora Unix (número de segundos desde a época) ou YYYYMMDD , que seria classificável lexicograficamente) e verificar se é mais antigo que seis meses.

Por exemplo, um script como (digamos, em /path/to/compare.sh ):

#! /bin/bash

LAST=$(date -d '6 months ago' +%s)

for FILE
do
    NAME=$(basename $FILE)
    DATE=$(perl -pe 's/(\d{2})(\d{2})(\d{4})/$3$2$1/' <<<$NAME)
    if (( $(date -d "$DATE" '+%s') < $LAST ))
    then
        rm -r $FILE
    fi
done

E faça:

/path/to/compare.sh /var/app/backup/*

Aqui estou convertendo para o número de segundos. Eu tive que reorganizar DDMMYYY para YYYYMMDD , pois meu date não aceitou o primeiro como uma data válida. A conversão para segundos é redundante por causa disso, mas não sei por que date está rejeitando a primeira (talvez uma questão de localidade?).

    
por 02.12.2014 / 06:01
1

Vou me concentrar apenas na parte de remoção da sua pergunta. Se você tem a lista de nomes de arquivos como este:

$ cat data.txt
01012000
01022000
01032000
01012014
01022014
01032014
01042014

E você sabe que a data limite para 6 meses é "01022014". Você pode usar sort & sed para determinar quais arquivos precisam ser excluídos, da seguinte forma:

Isso reverterá os arquivos:

$ sort -r data.txt 
01042014
01032014
01032000
01022014
01022000
01012014
01012000

Isso deixará qualquer um dos arquivos mais recentes, levando à nossa data de corte, "01022014".

$ sort -r data.txt | sed '1,/01032000/d'
01022014
01022000
01012014
01012000

OBSERVAÇÃO: sed '1,/PATTERN/d' exclui (ou seja, d ) todas as linhas que ocorrem da primeira linha (ou seja, 1, ) até que nosso PADRÃO seja encontrado.

Finalmente, a lista pode ser enviada para xargs para exclusão:

$ sort -r data.txt | sed '1,/01032000/d' | xargs rm
    
por 02.12.2014 / 07:43
0

Você pode usar a expansão de chave de alcance:

Remova a cada meio ano:

echo /path/to/directories/01{01..06}{2000..2014}

OU remova tudo, exceto o último meio ano:

echo /path/to/directories/01{01..12}{2000..2013}
echo /path/to/directories/01{01..06}2014

Substitua echo por rm -r e atualize o caminho.

    
por 02.12.2014 / 05:47