同步两台服务器同名文件与目录的属主及属组需求问询
同步两台服务器同名文件/目录的属主属组(仅处理双方共有的文件)
这里有两种可靠的方法可以实现你的需求——只同步双方都存在的文件/目录的属主和属组,完全不涉及文件内容的复制:
方法1:用rsync(最简洁高效)
rsync本身就支持只同步文件属性而不复制内容,再配合--existing选项就能精准只处理目标端(服务器B)已存在的文件(也就是A和B都有的文件)。
测试命令(先模拟运行,避免误操作)
在服务器A上执行:
rsync -r --owner --group --existing --dry-run /path/to/your/A/files/ user@serverB:/path/to/your/B/files/
-r:递归处理子目录--owner:同步文件/目录的属主信息--group:同步文件/目录的属组信息--existing:只处理服务器B上已经存在的文件/目录(过滤掉单方存在的)--dry-run:仅模拟操作,不会实际修改任何属性,方便你先确认要修改的对象
如果测试结果符合预期,去掉--dry-run执行实际同步:
rsync -r --owner --group --existing /path/to/your/A/files/ user@serverB:/path/to/your/B/files/
注意:执行命令的用户需要在服务器B上拥有修改文件属主/属组的权限,如果普通用户权限不够,可以加上
sudo(需要配置免密sudo或者输入密码):rsync -r --owner --group --existing /path/to/your/A/files/ user@serverB:'sudo -S /path/to/your/B/files/'
方法2:用find + ssh(更灵活,适合自定义场景)
如果需要更精细的控制,比如只同步特定类型的文件,可以用find生成修改命令,再通过ssh传到服务器B执行,同时检查文件是否存在。
命令示例(在服务器A上执行)
find /path/to/your/A/files/ -printf 'if [ -e "%P" ]; then chown %u:%g "%P"; fi\n' | ssh user@serverB 'cd /path/to/your/B/files/ && bash -s'
find ... -printf:生成针对每个文件/目录的条件命令——先检查B上是否存在该路径(%P是相对于A源目录的相对路径),存在则修改属主属组(%u是A上的用户ID,%g是组ID,如果你想用用户名/组名替换,把%u:%g改成%U:%G即可)ssh ... bash -s:把生成的命令传到B上,切换到对应目录后执行
同样,权限不足时可以加入sudo调整:
find /path/to/your/A/files/ -printf 'if [ -e "%P" ]; then sudo chown %u:%g "%P"; fi\n' | ssh user@serverB 'cd /path/to/your/B/files/ && bash -s'
关键注意事项
- 如果两台服务器的用户/组ID不对应,优先用
%u:%g(ID)而不是用户名/组名,避免出现权限混乱 - 无论用哪种方法,都建议先在测试目录或者小范围文件上验证效果,再批量执行
- 确保ssh连接是可靠的,最好配置免密登录,避免批量操作时反复输入密码
内容的提问来源于stack exchange,提问作者Rafael Linux User
相关产品推荐
相关产品推荐

