能否请有人指导一下下面的增量备份脚本,我已经编写了脚本。我在循环脚本时遇到一个问题。
我需要的要求:假设源文件夹包含 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
该inotifywait
命令将保持阻塞状态,直到某个文件被修改或创建(-e modify,create
选项),并且非常高效。