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


16

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


Rsync具有详细记录的退出值。如果您的情况并不要求将所有这些都视为失败,则不应将所有这些都视为失败。
jordanm

@jordanm但是没有足够具体的错误代码来仅指出此错误。
吉尔(Gilles)“所以,别再邪恶了”

Answers:


7

Rsync没有为此的选项。我看到两个解决方案。一种是解析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"

这可能是他最好的选择。希望他只需要运行一次,因为stat()每个文件必须两次(一次通过rsync一次,一次通过find一次)会很糟糕。
jordanm

@Gilles这似乎可行,除了隐藏文件。我假设相同的策略可以进行一些细微调整。我对\!不熟悉!(斜线惊叹号)您能解释一下吗?
JeffCharter

1
@JeffC \!引用!运算符以保护它免受shell扩展的影响。这里实际上不需要反斜杠,因为!当空格后没有外壳会扩展,但是不会造成伤害。隐藏文件怎么了?
吉尔斯(Gilles)'所以别再邪恶了'

3

针对这种特定情况,我做了一个简单的解决方法:

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

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

不过,请务必注意,这将忽略所有Partial transfer due to error错误,而不仅仅是权限错误,因为它将捕获所有退出代码的错误23。有关rsync状态代码的更多信息,请参考此链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.