rsync实操:如何分批复制文件、暂停后重复执行
分批同步XML文件的Shell脚本实现
这个场景我之前帮朋友处理过类似的,刚好可以给你一个实用的bash脚本方案,完美适配你的需求——每次同步2500个文件,等待5分钟后继续下一批,直到所有文件处理完毕。
核心脚本示例
#!/bin/bash # 配置参数,根据你的实际情况修改 SOURCE_DIR="/path/to/your/xml/files" TARGET="user@remote-server:/path/to/target/dir" BATCH_SIZE=2500 WAIT_SECONDS=300 # 5分钟=300秒 # 循环处理直到源目录没有XML文件 while true; do # 用null分隔符处理带空格/特殊字符的文件名,避免出错 FILES=$(find "$SOURCE_DIR" -maxdepth 1 -type f -name "*.xml" -print0 | head -z -n $BATCH_SIZE) # 如果没有找到文件,退出循环 if [ -z "$FILES" ]; then echo "所有XML文件已同步完成,退出脚本" break fi # 同步选中的文件,同步成功后删除源文件 echo "开始同步 $BATCH_SIZE 个文件..." echo -e "$FILES" | rsync -av --remove-source-files --files-from=- --from0 "$SOURCE_DIR/" "$TARGET" # 检查rsync是否执行成功 if [ $? -eq 0 ]; then echo "本次同步完成,等待 $WAIT_SECONDS 秒..." sleep $WAIT_SECONDS else echo "本次同步失败,将在10秒后重试..." sleep 10 fi done
关键细节解释
- 文件名安全处理:用
find ... -print0和rsync --from0来处理包含空格、特殊字符的文件名,避免脚本因为文件名问题报错。 - 同步后删除源文件:
rsync --remove-source-files参数会在文件成功同步到目标服务器后才删除源文件,比单独用rm更安全,避免同步失败导致文件丢失。 - 循环终止条件:每次循环开始时检查源目录是否还有XML文件,没有就自动退出。
- 错误重试:如果rsync执行失败(比如网络中断),脚本会等待10秒后重试,避免直接中断整个流程。
可选调整:按特定顺序同步
如果需要按修改时间、字母顺序或者随机顺序选择文件,可以修改find命令的部分:
- 按字母顺序排序:
FILES=$(find "$SOURCE_DIR" -maxdepth 1 -type f -name "*.xml" | sort | head -n $BATCH_SIZE | tr '\n' '\0')
- 按修改时间从旧到新排序:
FILES=$(find "$SOURCE_DIR" -maxdepth 1 -type f -name "*.xml" -printf "%T@ %p\n" | sort -n | cut -d' ' -f2- | head -n $BATCH_SIZE | tr '\n' '\0')
- 随机选择文件:
FILES=$(find "$SOURCE_DIR" -maxdepth 1 -type f -name "*.xml" | shuf | head -n $BATCH_SIZE | tr '\n' '\0')
使用说明
- 修改脚本中的
SOURCE_DIR、TARGET等参数为你的实际路径和服务器信息。 - 给脚本添加执行权限:
chmod +x sync_batch.sh。 - 可以把脚本放到后台运行,或者用
nohup保证断开连接后继续执行:nohup ./sync_batch.sh > sync_log.out 2>&1 &
内容的提问来源于stack exchange,提问作者user2792137
相关产品推荐
相关产品推荐

