我用来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
指令。
这假设不存在名称包含换行符的不可读文件。如果您需要处理这些问题,您需要生成一个像这样的空分隔文件列表,并将选项传递-0
给rsync
:
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状态码的信息请参考这个链接。