![](/img/trans.png)
[英]rsync using shopt globstar and **/. - how to exclude directories?
[英]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.