Linux脚本,同一服务器增量备份

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

inotifywait命令将保持阻塞状态,直到某个文件被修改或创建(-e modify,create选项),并且非常高效。

相关内容