Como excluo o arquivo por nome de arquivo que estão definidos como datas?

1

Eu quero excluir o arquivo não por acesso à data ou criado, mas por nome de arquivo. Os nomes dos arquivos serão datas e eu quero que um cronjob seja executado uma vez por semana, o que apagará as datas do arquivo com mais de 7 dias. Eu poderia fazer um

find /my/directory -type f -name '*file-name.yyyy-mm-dd.qz' -delete

Mas eu teria que mudar o roteiro semanalmente para ser executado. Eu gostaria de evitar ter que modificar o trabalho toda semana.

    
por CP24eva 06.06.2016 / 19:09

4 respostas

2

Aqui está uma forma mais robusta que manipula corretamente espaços (ou até mesmo novas linhas) em nomes de arquivos e diretórios.

find . -type f -name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz' -exec sh -c 'fdate="${1%.qz}"; fdate="${fdate##*.}"; [ "$fdate" "<" "$(date +%F -d "7 days ago")" ] && rm "$1"' find-sh {} \;

Isso envolve muitos truques que podem parecer estranhos para algumas pessoas, então vamos dividi-lo:

Começando no diretório atual, encontre recursivamente todos os arquivos regulares ...

find . -type f

... cujos nomes terminam no padrão exato ".YYYY-MM-DD.qz" ...

-name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz'

... então, execute um comando shell em cada arquivo correspondente (observe as aspas simples) ...

-exec sh -c '

... que primeiro retira o ".qz" ...

fdate="${1%.qz}";

... então retira a parte extra inicial, deixando apenas "AAAA-MM-DD" ...

fdate="${fdate##*.}";

... e compara essa string para ver se ela é ordenada (lexicamente) antes de "AAAA-MM-DD" da data de sete dias atrás ...

[ "$fdate" "<" "$(date +%F -d "7 days ago")" ]

... e, em caso afirmativo, remove o arquivo ...

&& rm "$1"'

... e usaremos "find-sh" como o "nome do script" (por exemplo, $0 ) a ser usado no relatório de erros ...

find-sh

... e defina o nome do arquivo encontrado por find para o parâmetro um ( $1 ) do script de shell in-line.

{} \;
    
por 06.06.2016 / 21:43
1

Não posso postar um comentário, mas aqui está o comando para criar arquivos de teste vazios:

for i in {0..50};do touch blah.'date "+%Y-%m-%d" -d "$i days ago"'.qz  ;done

Eu acredito que a resposta de Dave faz o truque. (Eu precisava completar o comando for com '; do')

Um ótimo liner para o cron.

    
por 06.06.2016 / 21:21
0

Eu recomendarei um script curto, basicamente obtém todos os nomes de arquivos que possuem uma data como format, e então percorre todos eles, verificando se há sete dias é posterior à data encontrada no nome do arquivo e, em caso afirmativo, exclui-o.

A análise de data basicamente faz um inteiro no formato AAAAMMDD e compara usando isso, o que deve funcionar bem, já que as unidades maiores têm um fator maior de dez.

Este é um roteiro grosseiro que eu não tive a chance de testar.

for file in $(find /my/directory -type f -name "*file-name.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz")
    if [ $(date -d '7 days ago' +"%Y%m%d") -ge $(date -d $(echo $(basename $file) | cut -d '.' -f 2) +"%Y%m%d") ]; then
        rm $file
    fi
 done
    
por 06.06.2016 / 20:30
0

Você pode usar isto:

find /my/directory -type f -name "*file-name.$(date -d '7 days ago' +%Y-%m-%d).qz" -delete 

Isso permite que o shell nos informe a data de 7 dias: $(date -d '7 days ago' +%Y-%m-%d)

Por exemplo: se hoje for 2016-06-06 , isso será: 2016-05-30

Assim, sempre que seu comando for executado, isso levará a data 7 dias atrás e assim por diante.

Espero que você me entenda. Se você precisar de algo, apenas comente.

    
por 06.06.2016 / 19:26