tar comando no loop for

0

Eu sei que é a questão básica, mas por favor me ajude. Eu compactei e arquivei meu arquivo de log do servidor usando o comando tar

for i in server.log.2016-07-05 server.log.2016-07-06 ; do tar -zcvf  server2.tar.gz $i; done

a saída do loop acima é

server.log.2016-07-05
server.log.2016-07-06

Mas, ao listar o arquivo usando tar -tvf server2.tar.gz a saída obtida é

rw-r--r-- root/root 663643914 2016-07-06 23:59 server.log.2016-07-06

i.e., arquivei dois arquivos, mas apenas um arquivo foi exibido, o que significa que o arquivo não possui os dois arquivos, o arquivo deve ter todos os arquivos. Por favor, ajude nisso.

Acabei de testar com esses dois arquivos, mas minha pasta tem vários arquivos. Como não obtive a saída esperada, não prossegui com todos os arquivos da pasta. O loop exato que vou usar é

Previousmonth=$(date "+%b" --date '1 month ago')

for i in $(ls -l | awk '/'$Previousmonth'/ && /server.log./ {print $NF}');do;tar -zcvf server2.tar.gz $i;done
    
por karthik 06.08.2016 / 07:05

3 respostas

2

Cada vez que o loop é executado, o comando tar é executado para colocar um arquivo no arquivo server2.tar.gz . O arquivo terminará com apenas um arquivo.

Use a opção tar para anexar arquivos:

tar --append -zcvf server2.tar.gz "$i"

ou apenas forneça a lista de arquivos para o tar (por favor, não use este comando):

tar -zcvf server2.tar.gz  $(ls -l|awk '/'$Previousmonth'/&&/server.log./{print $NF}')

No entanto, essa linha de comando tem alguns problemas:

  • analisando ls output (errado).
  • usando $Previousmonth sem cotação (errado).
  • criando uma lista de arquivos que podem ter espaços incorporados (confiáveis).

use este (par de) comando (s):

month=$(date "+%Y-%m-" --date '1 month ago')
find ./ -name "server.log.${month}*" -exec tar -zcvf server2.tar.gz '{}' \+
    
por 06.08.2016 / 08:49
3

Resposta para a pergunta original

A solução não é usar um loop for . Sobrescreve o arquivo a cada vez. Em vez disso, use:

tar -zcvf server2.tgz server.log.2016-07-05 server.log.2016-07-06

Isso adiciona quantos arquivos você listar na linha de comando para o mesmo arquivo.

Resposta para a pergunta revisada

Para compactar todos os arquivos de julho:

tar -zcvf server2.tgz server.log.2016-07-*

Ou, para compactar todos os arquivos do mês anterior, o que quer que fosse:

tar -zcvf server2.tgz server.log.$(date "+%Y-%m" --date '1 month ago')-*
    
por 06.08.2016 / 07:28
1

@ John1024 já deu uma uma boa resposta , mas eu pensei em adicionar um pouco mais

Em algumas circunstâncias, você pode adicionar arquivos a um tar archive existente. Por exemplo, você tem um arquivo de arquivos de log para cada mês e deseja adicionar os arquivos de log diários a esse arquivo todas as noites após a rotação do arquivo de log que pode ocorrer à meia-noite.

Se o seu arquivo for chamado /data/logs/logfiles-2016-08.tar para agosto e os próprios arquivos de log girados, para uma data específica, forem chamados /var/log/servicename-2016-08-06.log (para vários valores diferentes de servicename ), você pode ter um script pequeno chamadas de trabalho cron às 3 da manhã que faz

#!/bin/sh

yyyymm="$( date --date="1 day ago" +"%Y-%m" )"
yyyymmdd="$( date --date="1 day ago" +"%Y-%m-%d" )"

for logfile in /var/log/*-$yyyymmdd.log; do
  tar -r -C /var/log -f "/data/logs/logfiles-$yyyymm.tar" "${logfile##*/}" &&
  rm "${logfile##*/}"
done

O sinal -r informa tar para anexar entradas ao arquivo. O -C flag é usado para informar tar para alterar o diretório para /var/log antes de acessar os arquivos de log. O sinalizador -f especifica a localização do arquivo. O ${logfile##*/} expandirá para o nome da base (o nome do arquivo sem caminho) do arquivo de log (isso pode ser substituído por $(basename "$logfile") ).

No início de cada mês, você pode compactar o arquivo de log do mês anterior com

#!/bin/sh

yyyymm="$( date --date="1 month ago" +"%Y-%m" )"

gzip --best "/data/logs/logfiles-$yyyymm.tar"

Isso é um pouco mais complicado do que apenas fazer

cd /var/log &&
tar -c -z -f /data/logs/logfiles-2016-08.tar.gz *-2016-08-??.log &&
rm *-2016-08-??.log

uma vez por mês, mas pode haver razões para fazê-lo mesmo assim.

Nota: Um arquivo pode ser adicionado a um arquivo com tar -r , mas o arquivo não pode ser um arquivo compactado no momento (GNU tar pode suportar isso). Se o arquivo não existir, ele será criado. Observe também que meus exemplos acima requerem o GNU date .

    
por 06.08.2016 / 09:37