递归地更改文件所有权而不会出现错误

递归地更改文件所有权而不会出现错误

我正在尝试编写一个脚本,在更改用户的 UID 后修复特定用户拥有的所有文件的所有权。

目前,我运行:

chown -Rhc --from=${OLD_UID} ${NEW_UID} /
chown -Rhc --from=:${OLD_UID} :${NEW_UID} /

哪里OLD_UIDNEW_UID是我刚刚修改的用户的新旧UID。

这达到了预期的效果,但总是以返回码 1 退出,因为出现如下错误:

chown: cannot access ‘/proc/1103/task/1103/fd/4’: No such file or directory
chown: cannot access ‘/proc/1103/task/1103/fdinfo/4’: No such file or directory
chown: cannot access ‘/proc/1103/fd/4’: No such file or directory
chown: cannot access ‘/proc/1103/fdinfo/4’: No such file or directory

我的理论是,查找所有文件的进程会选择自己的进程,当chown尝试访问它时,该进程将不存在。

我可以丢弃命令的返回代码,但我不想这样做,以防我最终忽略真正的错误。

任何人都可以建议一种不会报告虚假错误的替代方法吗?

答案1

您可以使用find, 并告诉它不要下降到其他文件系统(这应该阻止它访问虚拟文件系统,如procsys等):

find / -xdev -uid ${OLD_UID} -execdir chown ${NEW_UID} {} +

这可能效率不高。

过滤掉虚拟文件的另一种方法是将根文件系统重新挂载到其他位置:

mkdir /tmp/chroot
mount -o .. -t .. /dev/... /tmp/chroot

chown继续运行/tmp/chroot

相关内容