rsync:跳过我没有权限的文件

rsync:跳过我没有权限的文件

我用来rsync -rlptD从另一个用户复制目录。有一些文件(我无法提前知道这些)我无权复制。有没有办法让 rsync 忽略这些。问题是,如果 rsync 返回非零,我的 bash -x 脚本将退出。

答案1

Rsync 没有此选项。我看到两个解决方案。一是解析rsync错误消息;这不是很稳健。另一种是生成不可读文件列表来过滤。

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

如果您find没有-readable-executable,请将它们替换为适当的-perm指令。

这假设不存在名称包含换行符的不可读文件。如果您需要处理这些问题,您需要生成一个像这样的空分隔文件列表,并将选项传递-0rsync

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

答案2

我针对这种具体情况做了一个简单的解决方法:

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

如果返回的代码是 0 或 23,则返回0,并在所有其他情况下返回退出代码。

然而,重要的是要注意,这会忽略所有Partial transfer due to error错误,而不仅仅是权限错误,因为它会捕获退出代码的所有内容23。更多关于rsync状态码的信息请参考这个链接

相关内容