localize e exclua arquivos anteriores a dias específicos e tenha uma string específica em nomes de arquivos

0

Para excluir arquivos com mais de 5 dias de um diretório, podemos usar o comando.

find /directory -type f -mtime +5 -delete

Mas, no meu caso, quero excluir apenas os arquivos com 'YYYY-MM-DD' em seus nomes e com mais de 5 dias.

Abaixo estão alguns exemplos de nomes de arquivos:

TEST_2016-11-20_14_02_52.log
server.log.2016-11-13
locsub.log.2016-12-04
wsgi.txt.2016-12-01

Apenas arquivos com nome no formato '' e mais de 5 dias devem ser excluídos.

Como combinar nomes de arquivos no comando find usando regex ??

    
por AVJ 07.12.2016 / 15:07

2 respostas

1

Usando o GNU find :

find . -type f -mtime +5 \
    -regextype egrep -regex '.*[0-9]{4}-[0-9]{2}-[0-9]{2}[^/]*$' \
    -delete

A expressão regular corresponderá a qualquer string no nome de base de um nome de caminho que contenha uma data no formulário YYYY-MM-DD . Observe que também podemos corresponder a XXYYY-MM-DDZZ , em que XX e ZZ são outros caracteres.

O [^/]*$ no final garante que, na verdade, estamos combinando a expressão com o nome de base do nome de caminho atual e significa "no / para o restante da string, por favor".

Usando um padrão de caractere curinga de shell (mais fácil de manter):

find . -type f -mtime +5 \
    -name '*[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]*' \
    -delete

Observe que -mtime +5 é para arquivos cuja idade como um número inteiro de dias é estritamente maior que 5, portanto, 6 dias ou mais. Para arquivos com 5 dias ou mais, você precisaria de -mtime +4 .

    
por 24.05.2018 / 21:56
0

Supondo que você esteja trabalhando com ferramentas GNU, isso deve evitar os falsos positivos falados por Babyy:

find /directory -type f -mtime +5 -print | while read f; do
    n='basename "$f"'
    d='expr "X$n" : 'X.*\([0-9]\{4,\}-[0-9]\{2\}-[0-9]\{2,\}\)'' # (1)
    test -n "$d" || continue                                     # (2)
    date -d "$d" >/dev/null 2>&1 && rm "$f"                      # (3)
done

Observações:

  • (1) atribui a parte da data do nome do arquivo a d . Inclui a liderança e dígitos finais. Se não houver data, a string vazia é atribuído a d .
  • (2) irá pular para a próxima iteração se "$d" for a string vazia. Isso é necessário para impedir que (3) remova o arquivo, pois date -d terá sucesso se for dada a string vazia como seu argumento. (Isso parece ser um bug no GNU date , mas talvez esse comportamento tenha sido intencional.)
  • (3) removerá o arquivo se "$d" contiver uma data válida. Observe que date -d será bem-sucedido se a parte do ano da data contiver mais de 4 dígitos, desde que as partes do mês e do dia sejam válidas. Agora isso é realmente prova de futuro seu código!
por 01.01.2017 / 02:22