Crie .tar.gz de um diretório omitindo alguns subdiretórios e adicione somente arquivos novos ou alterados

2

Eu preciso criar um script, talvez bash , talvez apenas um .sh que verifica as alterações de arquivos em um diretório raiz e subdiretórios da raiz e adiciona a um novo arquivo. O nome do arquivo tar.gz deve ter a data de criação no final (por exemplo, monitor-17.06.2013.tar.gz ). Eu fiz isso:

tar -zcvf /home/monitor.tar.gz /var/www/html/monitor --exclude /var/www/html/monitor/cache /var/www/html/monitor/log

e funciona, mas o diretório /var/www/html/monitor/log não é omitido, o nome do arquivo não contém a data, e isso está faltando a parte que adiciona apenas arquivos novos ou alterados porque eu não sei como fazer isso.

EDIT: esclarecer um pouco minhas necessidades Ok, devido a alguns comentários dos usuários aqui vou tentar deixar exatamente o que estou procurando.

Day1: 2013-06-15
Directory: /var/www/html/monitor
Backup File Created: monitor-2013-06-15.tar.gz (contains all the content of /monitor folder)

Day2: 2013-06-16
Directory: /var/www/html/monitor
Files Changed: 
  /var/www/html/monitor/file1.php
  /var/www/html/monitor/log/file2.php
  /var/www/html/monitor/web/file3.php

Files Added: 
  /var/www/html/monitor/index.php
Backup File Created: monitor-2013-06-16.tar.gz (contains **only** the files index.php, file1.php, file2.php and file3.php)

Day3: 2013-06-17
Directory: /var/www/html/monitor
Files Changed: 
  /var/www/html/monitor/index.php
Backup File Created: monitor-2013-06-17.tar.gz (contains **only** the file index.php)

O primeiro backup sempre terá todo o conteúdo, mas o restante deve ter apenas os arquivos modificados e os arquivos mais recentes, nada mais.

    
por Reynier 17.06.2013 / 23:10

2 respostas

2

Para inserir a data atual no nome do arquivo, chame o comando date em uma substituição de comando .

tar -czf monitor-$(date -d %Y-%m-%d).tar.gz …

Eu recomendo usar um formato de ano-mês-dia para a data por vários motivos: a ordem lexicográfica corresponde à ordem cronológica; não há risco de confusão entre o mês-dia-ano dos EUA e o dia-mês-ano do resto do mundo; é um padrão ISO.

Para excluir vários diretórios, você precisa repetir --exclude para cada um deles: se você escrever tar -czf monitor.tar.gz --exclude dir1 dir2 , então dir2 é um caminho para incluir no arquivamento, apenas dir1 é um argumento para --exclude .

tar -czf monitor-$(date -d %Y-%m-%d).tar.gz --exclude /var/www/html/monitor/cache /var/www/html/monitor/log /var/www/html/monitor

Para armazenar arquivos que foram modificados após uma determinada data, passe a opção --newer . Você pode especificar um arquivo de referência ou uma data. É muito mais confiável trabalhar com um arquivo de timestamp: crie esse arquivo antes de cada backup e use o arquivo timestamp do backup anterior como referência para o próximo.

touch monitor-backup.timestamp.new
tar … --newer=./monitor-backup.timestamp
mv -f monitor-backup.timestamp.new monitor-backup.timestamp

Você parece estar usando seu próprio sistema de backup incremental. Isto é surpreendentemente difícil de fazer de forma confiável. Recomendo usar um aplicativo de backup existente, como a Duplicidade .

    
por 18.06.2013 / 01:26
0

Quanto ao diretório omitido, você terá que usar a opção --exclude para cada diretório, isso não significa que ele exclua tudo depois dele. Alguns comandos terão valores separados por vírgulas, mas não todos.

tar -zcvf /home/monitor.tar.gz /var/www/html/monitor --exclude /var/www/html/monitor/cache --exclude /var/www/html/monitor/log

Quanto à parte de anexar a data, com sua explicação do que você está procurando, estou pensando que você pode usar:

-d, --diff, --compare
      find differences between archive and file system

edit: Aqui está um pequeno script rápido para fazer isso. Não há verificação de erros nem nada, mas é um começo.

NEW_FILE="monitor.'date +%d.%m.%Y'.tar.gz"
PREV_FILE={However you want to find this}

tar cf $NEW_FILE 'tar --diff -f $PREV_FILE  | awk --field-separator=: '{print $1}' | uniq'
    
por 18.06.2013 / 00:26