Compare o conteúdo de arquivos gerados dinamicamente

1

Pergunta curta: Eu tenho dois arquivos tar gerados dinamicamente (para que eles tenham timestamps diferentes), como posso compará-los, ignorando qualquer diferença no tempo?

Fundos ...

Eu estou fazendo algum backup, no qual eu uso um script para gerar coisas que precisam de backup, colocá-las em um diretório, depois tar o diretório e manter várias versões antigas. O script de backup precisa ser executado a cada 30 minutos para garantir que não perderemos horas de trabalho.

Agora percebo que há períodos de tempo em que os dados não mudam, por isso não faz sentido armazenar duplicatas da mesma coisa repetidas vezes. Eu gostaria de comparar os arquivos antes de salvar. Minha tentativa foi executar cmp newdata.tar.gz olddata.tar.gz e armazenar apenas newdata.tar.gz se contiver novos dados. Aparentemente, isso não funcionou, porque existem timestamps diferentes.

    
por phunehehe 01.04.2011 / 11:33

4 respostas

2

Aqui estão três abordagens. O primeiro tem a minha preferência.

Altere o processo de geração de arquivos

Em vez de regenerar os arquivos indiscriminadamente ( dump_table foo >foo.dump ), mantenha o arquivo antigo, se for idêntico ao novo.

dump_table foo >foo.dump.new
if cmp foo.dump foo.dump.new; then
  rm foo.dump.new
else
  mv foo.dump.new foo.dump
fi

Monte os arquivos como diretórios

Use o AVFS para criar uma visão de toda a sua hierarquia de diretórios onde todos os arquivos possuem um diretório associado (mesmo nome com # anexado no final) que parece conter o conteúdo do arquivo.

mountavfs
d=$(date -d %Y%m%d%H%M%S); mkdir $d; tar czf /path/to/$d.tgz $d; rmdir $d
cd /path/to/back/up
rsync -ac --compare-dest=~/.avfs/path/to/yesterday.tgz . ~/.avfs/path/to/$d.tgz

Use uma ferramenta de backup com o recurso necessário

Os programas de backup precisam ser extremamente confiáveis. É difícil para uma solução caseira cobrir todos os casos. Portanto, considere um programa de backup completo. Acho que a duplicidade faria o que você precisa: executa backups incrementais e usa o algoritmo rsync, por isso não deve desperdiçar qualquer espaço nos dados que já estão lá.

    
por 01.04.2011 / 23:03
2

Uma opção é usar uma ferramenta de backup como backup2l , que pode ser configurada para qualquer nível de backups diferenciais e qualquer número de backups completos. backup2l é executado como um cronjob em qualquer frequência que você goste e é configurado configurando alguns valores em seu arquivo conf. Na verdade, é um wrapper para tar ou afio, ele mantém as listagens de arquivos com hashes para localizar alterações e fornece uma maneira fácil de obter status ou restaurar um arquivo por data.

Uma segunda opção é usar um sistema de controle de versão como cvs , svn , git etc. Configure um cronjob que fará confirmações automáticas (e talvez marcação diária). Com base na opção vcs, você pode precisar de alguns scripts para adicionar novos arquivos ou remover os antigos.

Para uma frequência de meia hora, recomendo a opção vcs. Mas você pode combinar os dois usando backup2l (ou qualquer outra ferramenta de backup) para também fazer backup do repositório vcs (a redundância de backups é sempre boa).

    
por 02.04.2011 / 19:06
0

Os arquivos dentro dos arquivos mudam, ou são apenas novos adicionados?

Se você adicionar apenas arquivos e não alterar nenhum, tente algo assim:

tar ztf olddata.tar.gz | sort > tmpfile1
tar ztf newdata.tar.gz | sort > tmpfile2
diff tmpfile{1,2} > /dev/null
if test $? -eq 0
then
  echo ignore newdata.tar.gz
else
  echo keep olddata.tar.gz
fi
rm tmpfile{1,2}

Observe a ausência de v dos comandos do índice de conteúdo do tar.

Se você quiser apenas ignorar arquivos com conteúdo idêntico, adicione um v ao mix, como em:

tar ztvf olddata.tar.gz | sort > tmpfile1

e assim por diante.

    
por 01.04.2011 / 12:01
0

Tente isso, então:

OLDSUM='tar zxOf olddata.tar.gz | md5sum | awk '{print $1}''
NEWSUM='tar zxOf newdata.tar.gz | md5sum | awk '{print $1}''
if test "${NEWSUM}" != "${OLDSUM}"
then
  echo save newdata.tar.gz
else
  echo nothing changed
fi

O capital O extrai o conteúdo do arquivo para stdout .

Não funcionará, no entanto, a menos que os arquivos sejam adicionados ao arquivo exatamente na mesma ordem (o que eles provavelmente são, no entanto).

    
por 01.04.2011 / 15:44

Tags