求助:如何让Bash脚本仅同步更新后的目录至多台服务器
实现驱动目录的增量同步方案
问题分析
你当前脚本里的--ignore-existing参数会直接跳过目标服务器上已存在的文件,不管源文件是否有更新,这不符合“仅同步更新过的内容”的需求。而rsync本身就具备增量同步的能力,只需要调整参数即可实现。
修改后的脚本
#!/bin/bash # 源目录 source_directory="/images/drivers" # 远程服务器用户名 remote_user="username" # 远程服务器IP数组 remote_servers=("10.xx.xx.xxx" "10.xx.xx.xxx") # 远程服务器目标目录 destination_directory="/images/drivers" # 指定复制后目录的用户和组权限 ownership="name:name" # 循环同步到每台远程服务器 for server in "${remote_servers[@]}"; do rsync -avz --delete --chown="$ownership" "$source_directory/" "$remote_user@$server:$destination_directory/" done
参数说明
-a:归档模式,等同于-rlptgoD,会保留文件权限、所有者、时间戳等元数据,同时递归同步目录-v: verbose模式,显示同步过程的详细信息,方便排查问题-z:传输时压缩数据,节省网络带宽(如果服务器之间网络带宽充足,可去掉该参数提升同步速度)--delete:删除目标端存在但源端已删除的文件/目录(如果不需要同步删除操作,可直接去掉该参数)--chown="$ownership":设置同步后文件的所有者和组,保持权限一致性
额外说明
- rsync默认会对比源文件和目标文件的修改时间和文件大小,只同步有变化的文件,天然实现增量同步
- 如果需要更精准的内容对比(比如文件内容被修改但时间戳未更新的场景),可以添加
--checksum参数,基于文件哈希值判断是否同步,但会增加CPU消耗,按需使用即可
内容的提问来源于stack exchange,提问作者SaStubbs
相关产品推荐
相关产品推荐

