Compare e arquivo tar para 2 formatos de data do nome do arquivo

0

Eu preciso manter os arquivos daqui a 4 meses (3 meses anteriores + 1 mês atual) no diretório e tar o resto. Mas o problema é meus arquivos consistem em formato diferente.

StockList_03-01-2015.txt
Ref_01-02-2016.txt
Data_2015-07-20.txt
Test_2016-01-13.txt

Como no exemplo acima, a data está no formato dd-mm-aaaa ou aaaa-mm-dd , eu preciso extrair a data do nome do arquivo e comparar se não estiver no intervalo (3 meses anteriores + 1 mês atual), então o tará.

Hoje é dia 2 de março, os arquivos de 1 de dezembro de 2015 até hoje permanecerão, mas os demais serão exibidos.

Arquivos tar esperados do exemplo:

StockList_03-01-2015.txt
Data_2015-07-20.txt

Eu posso escrever o regex para esses dois tipos de formato de data, mas não sei como combiná-los.

Regex para aaaa-mm-dd:

ls |grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'   

Regex para dd-mm-aaaa:

ls |grep -Eo '[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}'

Comparar data:

files=($(ls | awk -v d=$(date -d '3 months ago' +%m-%Y.log) 'DATE_FROM_FILES< d {print;}' ))

tar cvzf archive.tar.gz "${files[@]}"
    
por hades 02.03.2016 / 04:14

1 resposta

1

Assumindo que o formato regular do nome do arquivo seja dado, onde a data é a última parte antes da extensão, e é imediatamente precedido por um sublinhado, além de que a extensão é sempre .txt, você poderia usar um script como o seguinte

d=$(date -d '3 months ago' +%Y-%m)
files=()
ls | while read f ; do
    df1="${${f##*_}%.txt}"
    df2=${df1//-//}
    df=$( date --date $df1 +%Y-%m 2>/dev/null || date --date $df2 +%Y-%m)
    [[ "$df" < "$d" ]] && files=( $files $f )
done
tar cvzf archive.tar.gz "${files[@]}"
# rm ${files[@]}

Os principais aspectos são: a string de data a ser comparada deve ter o valor do ano à esquerda do valor do mês para que a ordem alfabética faça sentido como uma ordem de data. Em seguida, o comando date pode receber a data como yyyy-mm-dd ou como dd/mm/yyyy ; assim, $df1 é obtido do nome do arquivo primeiro eliminando tudo até e incluindo o último sublinhado no nome do arquivo e, em seguida, eliminando a extensão .txt . $df2 é obtido substituindo - por / .

Dessa forma, um ou outro de $df1 e $df2 deve trabalhar para determinar a parte da data do nome do arquivo e para renová-lo no formato yyyy-mm para comparação. Note que date falha com uma mensagem de erro de uma data dd-mm-yyyy , que então o script canaliza para /dev/null

Depois, é apenas uma questão de agrupar os nomes de arquivos anteriores à data de corte, aplicá-los e (comentado) remover os arquivos tar.

    
por 02.03.2016 / 07:52