繁体   English   中英

不使用 rsync 如何在增量备份期间跳过/排除几个目录

[英]without using rsync how to skip/exclude few directories during the Incremental backup

有人可以指导以下逻辑吗? 如何在进行备份时从源路径中排除一些目录?

#!/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

下面添加了更多脚本,但是在运行此脚本时出现如下错误:

/home/ec2-user/source is being copied over to /home/ec2-user/destination/home/ec2-user/source
cp: omitting directory ‘//home/ec2-user/source’
/home/ec2-user/source/apple.txt is being copied over to /home/ec2-user/destination/home/ec2-user/source/apple.txt
cp: cannot create regular file ‘/home/ec2-user/destination/home/ec2-user/source/apple.txt//home/ec2-user/source/apple.txt’: No such file or directory
/home/ec2-user/source/durga.txt is being copied over to /home/ec2-user/destination/home/ec2-user/source/durga.txt
cp: cannot create regular file ‘/home/ec2-user/destination/home/ec2-user/source/durga.txt//home/ec2-user/source/durga.txt’: No such file or directory
/home/ec2-user/source/profiles is being copied over to /home/ec2-user/destination/home/ec2-user/source/profiles
cp: omitting directory ‘//home/ec2-user/source/profiles’
 #!/bin/bash
source=/home/ec2-user/source
dest=/home/ec2-user/destination
find $source -path "$source/logs" -prune -o -exec sh -c '
    dest=$0
   for file; do 
           if [ -a "$dest/$file" ] ; then
                if [ "$source/$file" -nt "$dest/$file" ]; then
                     echo "Newer file detected, copying .." >&2
                     cp  "$source/$file" "$dest/$file"
                else
                    echo "File $file exists, skipping" >&2
                fi
         else
                echo "$file is being copied over to $dest" >&2
                cp  "$source/$file" "$dest/$file"
          fi
  done' "$dest" {} +

您的脚本有几个问题。 他们不仅找到文件,还找到目录,这不是您想要的。 他们不会在复制之前创建目标目录。 您使用find的方式并不可靠,如果文件名包含空格(空格、制表符、换行符...),则会失败。 尝试类似(未测试):

#!/bin/bash

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

find "$source" -path "$source/logs" -prune -o -printf '%P\0' |
while IFS= read -r -d '' file; do
  if [ -d "$src/$file" ]; then
    if ! [ -d "$dst/$file" ]; then
      echo "Creating directory $dst/$file"
      mkdir -p "$dst/$file"
    fi
    continue
  fi
  if [ -a "$dest/$file" ] && [ "$source/$file" -ot "$dest/$file" ]; then
    echo "File $file exists, skipping"
    continue
  fi
  if [ -a "$dest/$file" ]; then
    echo "Newer file detected, copying .."
  else
    echo "$file is being copied over to $dest"
  fi 
  mkdir -p "$(dirname "$source/$file")"
  cp -f "$source/$file" "$dest/$file"
done

请注意,首先构建文件和目录列表,然后一次创建所有目录,最后一次复制所有文件可能会更快。

另请注意,如果您可以使用tar或等效的东西来创建要复制的所有文件的存档,然后在目标目录中解压缩此存档,事情可能会更容易和更快。 特别是如果你有 GNU tar ,因为它有几个方便的备份选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM