Script para arquivo Tar em um diretório específico

0

Estou tentando escrever um script Unix que irá para um diretório específico e tar.gz todos os arquivos de log com mais de 2 dias. Até agora eu tenho isso, mas não funciona. Qualquer ajuda seria apreciada.

#!/bin/bash

AGE_TO_COMPRESS="2419200" # 172800 seconds = 2 days
LOG_FILES="/myfile/logs"

for file in $LOG_FILES;
do
  if [ $(( 'date +%s')) -gt ${AGE_TO_COMPRESS} ]
     then
        tar -cvzf $file.tar.gz $file;
     fi
  fi
done
    
por Loc 07.02.2017 / 22:52

2 respostas

1

Corrigi os erros mais evidentes do seu script. Eu supus que LOG_FILES conterá uma lista de arquivos para compactar.

#!/bin/bash

AGE_TO_COMPRESS=2419200 # 28 days

# list of file to compress
LOG_FILES="/tmp/test/test /tmp/test/test2 /tmp/test/test3 /tmp/test/test4"

# Any file older than EDGE_DATE must be compressed
NOW=$( date +%s )
EDGE_DATE=$(( NOW - AGE_TO_COMPRESS ))

for file in $LOG_FILES ; do
    # check if file exists
    if [ -e "$file" ] ; then 

        # compare "modified date" of file to EDGE_DATE
        if [ $( stat -c %Y "$file" ) -lt ${EDGE_DATE} ] ; then

            # create tar file of a single file
            # this is an odd way to compress a file
            tar -cvzf $file.tar.gz $file

            # do we want to delete the old file?
            # rm "$file"
        fi
    fi
done

De qualquer forma, concordo com @dhag que uma solução find / bzip2 seria melhor.

Você levou em consideração para usar logrotate ? Por que você quer reescrever a roda quando existe software dedicado?

    
por 07.02.2017 / 23:59
0

O comando find -type f -mtime +2 encontrará arquivos com mais de dois dias. Você pode então usar a opção -exec do find para compactá-los; possivelmente assim:

find -type f -mtime +2 -exec gzip {} +

Se você sabe coisas extras sobre o arquivo, talvez seus nomes sejam todos terminar em .log , pode ser sensato adicionar isso ao seu filtro ( -name '*.log' ).

    
por 07.02.2017 / 23:25