Сценарий 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
вариант) и это очень эффективно.