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.