Removendo arquivos com base na data fornecida no nome do arquivo

0

Em um diretório, eu tenho alguns arquivos zip, conforme abaixo:

DBSOURCE20150601.gz
WINDOWS20150504.gz
NETWORK20150609.gz
PATCHTEST20150512.gz
.................
................

Eu quero excluir arquivos zip com mais de 10 dias, com base na data indicada no nome do arquivo. Por exemplo,

WINDOWS20150604.gz is file having date 4 June 2015.

Estou tentando seguir, mas não sei por que está removendo todos os arquivos zip em vez de apenas 10 dias mais antigos:

ten_days=$(date -d "10 days ago" +%Y%m%d)
for f in *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].gz; do
  date=${f#*}
  date=${date%.gz}
  (( $date < $ten_days )) && rm "$f"
done
    
por Sunny 10.06.2015 / 12:41

2 respostas

1

A data não foi extraída corretamente do nome do arquivo. Para fazer isso você precisa fazer o seguinte

    date=${f#*}
    date=${date%.gz}
    date='echo $date| rev '
    date=${date:0:8}
    date='echo $date| rev '

Esta data agora pode ser usada para comparação e exclusão

    
por 10.06.2015 / 12:58
1

Acho que você esperava que, na primeira linha, por exemplo, o comando date=${f#*} removeria DBSOURCE da variável f porque você fez referência a *[0-9]...[0-9].gz . Não é possível usar * in date=${f#*} para que a primeira parte seja removida da variável, pois * não é passado separadamente no loop for como DBSOURCE neste exemplo.

Se a estrutura do nome do arquivo é sempre a mesma, você pode simplesmente usar

date=${f//[^0-9]/}

para remover todos os caracteres não dígitos (na verdade, substitua todos os caracteres não dígitos por "nada")

Outra maneira é usar tr para extrair a data:

date='echo $f|tr -d '[:alpha:] [:punct:]''
    
por 10.06.2015 / 13:24

Tags