我正在尝试编写一个脚本,在更改用户的 UID 后修复特定用户拥有的所有文件的所有权。
目前,我运行:
chown -Rhc --from=${OLD_UID} ${NEW_UID} /
chown -Rhc --from=:${OLD_UID} :${NEW_UID} /
哪里OLD_UID
和NEW_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
, 并告诉它不要下降到其他文件系统(这应该阻止它访问虚拟文件系统,如proc
、sys
等):
find / -xdev -uid ${OLD_UID} -execdir chown ${NEW_UID} {} +
这可能效率不高。
过滤掉虚拟文件的另一种方法是将根文件系统重新挂载到其他位置:
mkdir /tmp/chroot
mount -o .. -t .. /dev/... /tmp/chroot
并chown
继续运行/tmp/chroot
。