Remove tudo, exceto o arquivo de backup mais recente, em meses

3

Eu tenho um diretório contendo muitos arquivos gerados semanalmente com nomes como

 db_20130101_foo.tgz
 db_20130108_foo.tgz
 db_20130115_foo.tgz
 ...

e assim por diante. Ao longo dos anos, os discos ficarão bem cheios. Como os arquivos contêm dados por várias semanas, podemos remover arquivos antigos. Eu quero remover todos os arquivos, mas sempre manter o último arquivo de cada mês. Como poderei conseguir isso sem ter que copiar & cole nomes de arquivos manualmente em rm, o que é muito trabalhoso e propenso a erros?

    
por mru 08.10.2015 / 19:33

2 respostas

2

Esse marcador de linha fornecerá os arquivos que você deseja excluir:

(ls -1 db_*_foo.tgz; echo) | awk '{prevym=ym; prevfile=file; ym=substr($0,4,6); file=$0; if (ym==prevym)print prevfile}'

A primeira parte apenas lista TODOS os arquivos (e adiciona uma linha extra ao final da lista, para simplificar o comando awk posterior). A parte awk apenas verifica cada linha para ver se o ym (yearmonth) mudou de uma linha para a próxima.

Teste e certifique-se de que a lista acima liste os arquivos que você deseja excluir. Então, para deletar todos os arquivos, simplesmente envie o comando para:

...ABOVE_COMMAND... | xargs rm

    
por 08.10.2015 / 20:34
1

resposta lá fora: rubi. ele tem um bom método group_by , então você pode pegar os arquivos com a mesma "chave" (primeiros 9 caracteres do nome do arquivo):

files = Dir.glob("*")
to_delete = []
files.group_by {|f| f[0,9]}.each_pair {|k,v| to_delete.push *(v.sort[0..-2])}
puts "removing: #{to_delete}"
File.delete to_delete
    
por 08.10.2015 / 20:48