Excluindo arquivo com condição específica com datas no nome do arquivo no linux

0

Preciso excluir todos os arquivos de uma pasta com a condição mencionada abaixo.

Padrão do nome do arquivo: fileNameBeginDateEndDate.txt (data inicial e final no formato AAAAMMDD)

Todos os arquivos nos quais a data atual não está entre as datas de início e de término precisam ser excluídos.

Exemplo, se a data de hoje for 2018-01-16,

  • Arquivo que precisa ser excluído: File2016010120170101.txt
  • Arquivo que não deve ser excluído: File2016010120190101.txt

Obrigado antecipadamente!

    
por dadha 16.01.2018 / 16:09

3 respostas

0

Este filtro emitirá apenas nomes de arquivo correspondentes aos seus critérios, ou seja, aqueles que precisam ser excluídos:

perl -MTime::Piece -ne 'BEGIN { $now=localtime->ymd("")} ($s,$e)=($_=~m/(\d{8})(\d{8})\./); print $_ if $e lt $now || $s gt $now'

Exemplos:

 echo "File2016010120170101.txt" | perl -MTime::Piece -ne 'BEGIN { $now=localtime->ymd("")} ($s,$e)=($_=~m/(\d{8})(\d{8})\./); print $_ if $e lt $now || $s gt $now'
 File2016010120170101.txt
 echo "File2016010120190101.txt" | perl -MTime::Piece -ne 'BEGIN { $now=localtime->ymd("")} ($s,$e)=($_=~m/(\d{8})(\d{8})\./); print $_ if $e lt $now || $s gt $now'
 (nothing)

Dependendo de como você tem sua lista inicial de nomes de arquivos, você pode pré-processar a lista e depois executar xargs rm no resultado.

Aconselho a adaptação do regex para ser o mais rigoroso possível, dependendo dos seus arquivos. E / Ou para revisar os arquivos prestes a serem excluídos antes de realmente excluí-los.

    
por 16.01.2018 / 16:37
0
Solução

find + bash :

find -type f -regextype posix-egrep -regex ".*/File[0-9]{16}\.txt" -exec \
bash -c 'd=$0; f="$1"; [[ $f =~ File([0-9]{8})([0-9]{8})\.txt ]]; 
         [[ "$d" -lt "${BASH_REMATCH[1]}" || "$d" -gt "${BASH_REMATCH[2]}" ]] && rm "$f"' \
         $(date +"%Y%m%d") {} \;
    
por 16.01.2018 / 17:00
0

com zsh :

set -o  extendedglob # best in ~/.zshrc
now=${(%):-%D{%Y%m%d}}
rm ./*[0-9](#c16).txt(e'{! ((now >= REPLY[-20,-13] && now <= REPLY[-12,-5] ))}'))
  • (%) parâmetro de expansão de parâmetro que ativa a expansão de prompts para a expansão do parâmetro.
  • ${:-value} : forma de expansão ${var:-value} sem Bourne, sem var , por isso, expande para o value fornecido.
  • %D{%Y%m%d} : promova a expansão para expandir para a data de hoje nesse formato. Outra abordagem seria usar zmodload zsh/datetime; strftime -s now %Y%m%d $EPOCHSECONDS ou usar o comando date do sistema: now=$(date +%Y%m%d) .
  • O operador (#c16) extendedglob corresponde a 16 do átomo anterior (semelhante ao {16}([0-9]) do ksh93).
  • (e:code:) : qualificador glob para selecionar arquivos com base na avaliação do código.
  • REPLY[-20,-13] : 20º a 13º últimos caracteres de $REPLY (que contém o caminho do arquivo examinado).
por 16.01.2018 / 17:09