Сценарий Linux, добавочное резервное копирование на том же сервере

Не могли бы вы дать кому-нибудь руководство по приведенному ниже сценарию инкрементального резервного копирования, я уже написал сценарий. У меня возникла проблема при зацикливании сценария.

Требование, которое мне нужно: считать, что исходная папка содержит A, B, C. Когда я запустил сценарий, A, B, C переместится в папку назначения. Опять же в исходную папку добавлены новые файлы/каталоги, т.е. D,E, и снова, если я запустил сценарий сейчас, он должен проверить наличие уже существующих файлов. В нашем случае A,B,C уже присутствуют в пункте назначения. Так что только D,E должны добраться до пункта назначения.

Из приведенного ниже кода я могу сделать резервную копию, но как сделать это в цикле. Пожалуйста, подскажите.

      #!/bin/bash
####################################
#
# Backup IS server script script.
#
####################################

# What to backup. 
Integrationserver="/home/ec2-user/source"

# Where to backup to.
dest="/home/ec2-user/destination"


# Create archive filename.
#date=$(date +%F)
IS=source
hostname=$(hostname -s)
#archive_file="$hostname-$IS-$date.tar.gz"
archive_file="$hostname-$IS.tar.gz"

# Print start status message.
echo "Backing up $Integrationserver to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar --exclude=/home/ec2-user/source/logs* --exclude=/home/ec2-user/source/TC*  -zcf $dest/$archive_file $Integrationserver

# Print end status message.
echo
echo "Backup finished"
date

Приведенный ниже код работает нормально со всеми условиями и требованиями. Но не знаю, как исключить несколько каталогов. Пожалуйста, укажите

      #!/bin/bash

source=/home/ec2-user/source
dest=/home/ec2-user/destination

for file in $(find $source -printf "%P\n") ; do
  if [ -a $dest/$file ] ; then
    if [ $source/$file -nt $dest/$file ]; then
      echo "Newer file detected, copying .."
      cp -r $source/$file $dest/$file
    else
      echo "File $file exists, skipping"
    fi 
  else
    echo "$file is being copied over to $dest"
    cp -r $source/$file $dest/$file
  fi 
done

1 ответ

Вы можете добиться этого с помощью гораздо более простого сценария, используяrsync:

      #!/bin/bash

source=/home/ec2-user/source
dest=/home/ec2-user/destination

changed=0

while [[ $changed -eq 0 ]]; do
    # The next command just count changes, does not copy anything
    changed=$(rsync -rin $source/ $dest | grep "^>f" | wc -l)
    sleep 1
done

echo "Copying $changed files"

rsync -qrt $source/ $dest

Я использовалsleep 1чтобы избежать ресурсоемкого цикла, но есть лучший способ использовать inotify-tools:

      inotifywait -e modify,create -r $source && \
  rsync -qrt $source/ $dest

The inotifywaitкоманда останется заблокированной до тех пор, пока какой-либо файл не будет изменен или создан (команда-e modify,createвариант) и это очень эффективно.

Другие вопросы по тегам