Fazendo backup de arquivos que foram modificados após a execução do último backup

2

Estou trabalhando em um script de backup (bash shell - Fedora - VMware) que deve comparar um arquivo com o último atributo modificado e a data atual e deve fazer o backup se a data da última modificação for anterior à última execução do script.

Eu tentei algumas coisas (awk, stat e grep), no entanto, eu não poderia fazer algo que permite a comparação e deixa o script decidir se os arquivos devem ser copiados ou não.

Por favor, concentre-se em 2 declarações de caso.

#! /bin/sh
echo "welcome to backup pro"
echo -e  "\n 1:Full \n 2:Incremental"
echo "Enter your choice"
  read choice
echo "Enter the files to be backup"
  read filetype
echo "Enter the destination folder"
  read destination
  case $choice in 
    1)
      echo "The selected backup type is Full backup"
      echo "Backing up $filetype files.."
      sleep 1
      cp *.$filetype /home/uone/backup_folder
      tar -zcvf archive_backup_folder.tar.gz backup_folder/   2>full-error.log
      mv archive_backup_folder.tar.gz /home/uone/backup_folder; cd /home/uone/backup_folder ;     rm *.$filetype
      sleep 1
      tail full-error.log
      break
    ;;
    2)
      echo "The backup you chose is Increment"
      ls -l | awk 'END {print $9 "\t" $8}'
      b=data "%H%M%S"   
        if [ $a -lt  $b ]; 
          then
          echo "This is under construction"
        fi
    ;;
  esac
exit 0
    
por Atul 10.08.2014 / 07:56

1 resposta

5

Embora você possa fazer isso com um loop e stat , se realmente quiser, isso é algo que find é bom e pode ser feito em uma única linha. Você pode criar um arquivo de timestamp especial toda vez que o script for executado e, em seguida, selecionar todos os arquivos mais recentes / antigos que o arquivo:

find -name "*.$filetype" ! -newer timestamp.file

Isso localizará todos os arquivos na árvore de diretórios nomeados de acordo com o padrão *.$filetype e que são mais antigos (não ! newer) do que o arquivo de registro de data e hora, como você pediu. Se você quiser arquivos mais recentes (o que parece ser mais útil), basta retirar o ! .

Encontrando os arquivos, você pode pedir ao find para fazer algo com eles usando '-exec:

find -name "*.$filetype" -newer timestamp.file -exec cp '{}' "$destination" +

Isso executará cp com todos os arquivos correspondentes como argumentos, para serem colocados no diretório nomeado por $destination , copiando todos os arquivos correspondentes para esse diretório.

No final de cada execução do seu script, você pode atualizar o registro de data e hora em seu arquivo de comparação com touch :

touch timestamp.file

e esse é o ponto de comparação que será usado na próxima vez. Se os arquivos puderem ser modificados enquanto o script estiver em execução, você precisará ser um pouco mais cuidadoso - atualize o arquivo de registro de data e hora logo no início, mas copie o antigo com seus atributos fora do caminho usando cp -p , e use isso para comparação (ou vice-versa).

Para comparar com o tempo atual (como no título), o -mtime test para find pode ser útil, mas acho que, no texto, o que você realmente quer é obter as alterações entre duas execuções do roteiro.

A tarring, interação do usuário, etc em seu script pode permanecer intocada. Se você quiser apenas arquivos no diretório atual (não subdiretórios), adicione -maxdepth 1 .

    
por 10.08.2014 / 08:17

Tags