我为这个愚蠢/简单的问题道歉 - 但在搜索网络和 SE 后,我找不到这个特定问题的答案。
问题:
如何仅为特定所有者拥有的文件更改所有者和组(系统范围内)?
用例:
我们有许多 RasPis 作为各种服务器运行并用于rsync备份它们。例如,当我们不幸不得不执行还原时,所有“用户”文件的所有者和组是pi:pi,而不是原始所有者adminuser:adminuser。
不寻找 拥有的文件pi,在哪里可以完成所有者/组重新分配?
编辑:这是 rsync 命令:
sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --exclude-from="${exc_path}" "${src_path}" "${dst_addr}:${dst_path}"
Run Code Online (Sandbox Code Playgroud)
您没有使用-numeric-ids和/或-fake-super用于您的备份(和恢复)。如果您rsync稍微修改您的命令,您将正确保存和恢复映射。
在这些示例中,-M告诉rsync在连接的远程端应用下一个选项,即伪造。一个额外的副作用是您不需要远程端(存储备份的地方)以 root 身份运行
这会将备份从客户端推送到备份服务器
sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids -M--fake-super --exclude-from="${exc_path}" "${src_path}" "${dst_addr}:${dst_path}"
Run Code Online (Sandbox Code Playgroud)
这将从客户端提取备份(即恢复)
sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids -M--fake-super --exclude-from="${exc_path}" "${dst_addr}:${dst_path}" "${src_path}"
Run Code Online (Sandbox Code Playgroud)
这在备份服务器上运行,会将备份推送到客户端(即恢复)
sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids --fake-super "${dst_path}" "${src_host}:${src_path}"
Run Code Online (Sandbox Code Playgroud)
每个文件单独存储其所有者信息,没有数据结构可以根据所有者索引文件。因此,无论您做什么,您都必须寻找文件,并分别更改每个文件的 UID。幸运的是,这并不难做到。这应该做:
find "$dir" -user olduser -exec chown newuser {} +
Run Code Online (Sandbox Code Playgroud)
当然,最好更改备份系统以存储(和恢复)正确的 UID,特别是如果您可能备份了属于多个用户的文件。