Arquivos tar do Linux há menos de 3 meses usando data no nome do arquivo

3

No Linux eu tenho arquivos cujo nome de arquivo está começando com a data YYYYMMDD

20160201_001.pdf
20160110_002.pdf
20150201_003.pdf
20140201_004.pdf

Eu quero tar esses arquivos menores que o intervalo de datas a seguir (não usando mtime, mas o período do nome do arquivo)

date +'%Y%m' -d '4 months ago'  (201511)

Basicamente eu quero fazer

files=($(find . -name filename< date +'%Y%m' -d '4 months ago'))
tar cvfz backup.tar.gz "${files[@]}"

O resultado esperado dos arquivos sendo tar:

20150201_003.pdf
20140201_004.pdf

Como posso fazer isso?

    
por hades 28.02.2016 / 06:31

3 respostas

2

Com esse formato de data, você pode usar a sequência de caracteres em awk , como:

files=( $(ls | awk -v d=$(date -d '4 months ago' +%Y%m%d_999.pdf) '$1<d {print;}') )
tar cvfz backup.tar.gz "${files[@]}"

O programa awk lê as linhas de entrada e aplica suas regras a elas. Neste caso, ele primeiro é invocado com a variável d set como a data de recorte expandida em um nome de arquivo. Então, para cada linha compara a primeira palavra ( $1 ) com a data de corte ( d ) com relação à ordem alfabética, e onde a entrada é antes do clipe, ela imprime a linha (caso contrário, não). p>

Para recortar mês, altere %d para 00 para excluir o mês de quatro meses atrás ou 99 para incluir o mês de quatro meses atrás.

    
por 28.02.2016 / 06:55
1

Por favor, verifique este script como por sua exigência. Espero que funcione para voce. Alterá-lo de acordo com sua exigência

lines='expr 0 + 0'
maxlines='expr 0 + 100'
while [ 1 -le 5 ] ; do
     d='date +%G%m%d'
     count='ls -1 | grep $d |wc -l'
     c='expr $count + 0'
     while [ $c -gt 0 ]; do
          file='ls -1 | grep $d |tail -$c |head -1'
          searchFile='grep $file tmp | head -1 | wc -l'
          searchFile='expr $searchFile + 0'
          if [  $searchFile -eq 0 ]; then
               cp $file /home/avinash/f
               echo $file >>tmp
               lines='expr $lines + 1'
          fi 
          c='expr $c - 1'
     done     
     if [ $lines -gt $maxlines ]; then 
            k='date +%G%m'
          grep $k tmp > t
          mv -f t tmp
          lines='expr 0 + 0'
     fi     
done

Este script irá escolher apenas os arquivos para a data atual conforme o tempo do servidor. Este script está sendo executado em um loop infinito.

Assim, sempre que houver um novo arquivo no diretório, ele verificará o nome do arquivo e, se o nome contiver a data de hoje, colocará o arquivo no diretório home/avinash/red de onde o PI server o selecionará para leitura.

Por favor, altere o nome da pasta de acordo com sua conveniência. Agora na pasta /home/avinash você precisa manter um arquivo chamado temp que este arquivo conterá apenas uma palavra ou qualquer símbolo digamos hi . O uso de temp é coletar todos os nomes de arquivos que o script já transferiu para a pasta PI. Assim, se o script tiver transferido o arquivo, digamos ABC_20110725.txt e DEF_20110725.txt , então tmp terá conteúdo

    
por 28.02.2016 / 07:09
1

Aqui está uma maneira:

$ files=( $(d=$(date +'%Y%m' -d '4 months ago'); 
          for f in *.pdf; do [[ "${f:0:6}" -le "$d" ]] && 
                             printf '%s\n' "$f"; done;) )
$ tar cvzf backup.tgz "${files[@]}"
20140201_004.pdf
20150201_003.pdf

Explicação

  • d=$(date +'%Y%m' -d '4 months ago') : defina a variável $d para a data desejada.
  • for f in *.pdf; do ... ; done : iterar todos os arquivos .pdf no diretório, salvando cada um como $f .
  • [[ "${f:0:6}" -le "$d" ]] : verifique se os primeiros 6 caracteres do nome do arquivo são menores ou iguais ao valor de $d .
  • && printf '%s\n' "$f"; done; : se estiverem, imprima o nome do arquivo.
  • files=( $( ... ) ) : salve a saída do acima no array $files .

Observe que isso pressupõe que todos os nomes dos arquivos pdf comecem com pelo menos 6 dígitos e queixam-se se não o fizerem. Você pode torná-lo mais robusto, iterando apenas sobre os arquivos PDF que fazem:

for f in [0-9][0-9][0-9][0-9][0-9][0-9]*.pdf; do ...
    
por 28.02.2016 / 13:41

Tags