You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

rsync重复传输本地已存在文件的问题解决求助

问题描述

通过rsync脚本将远程仓库文件同步至本地仓库,脚本由cron每分钟执行,此前稳定运行数月,目标仅传输并记录新文件。但近期远程仓库新增一个包含大量文件的文件夹后,其中已存在于本地的文件仍会被每次同步重复传输,queue.txt中出现重复传输记录,导致下游流程异常。已排查尾斜杠、本地文件存在性及存储空间,均无异常。

同步脚本(transfer.sh)
queueFile='.../queue.txt'
localrepo='.../local/repo'
foreignrepo='.../foreign/repo'

function syncFiles() {
  local dir="$1"
  local dest="$2"
  local queue="$3"
  for file in "$dir"/*
  do
    if [ -d "$file" ]; then
      # These are the different FCT File extensions
      rsync -av "$file"/*key*.csv "$dest" | grep -e 'csv' >>"$queue"
      syncFiles "$file" "$localrepo" "$queueFile"
    fi
  done
}

# Only run if queue.txt does not exist to limit ps creation
if [ ! -e "$queueFile" ]; then
    syncFiles "$foreignrepo" "$localrepo" "$queueFile"

    echo "Looping through queue lines"
    # Read lines 
    while read line; do
        # echo $line
                ... # this part works
    done < "$queueFile"
    rm "$queueFile"
else
    echo "Queue exists... exiting"
fi

注:已修正原脚本中>>"$queue的引号缺失问题,以及syncFiles调用时遗漏的第三个参数。

解决方法

1. 修复递归同步的目录结构问题

当前脚本递归调用时,所有子目录的CSV文件都直接同步到本地仓库根目录,未保留源目录结构。这会导致rsync无法正确对比源文件与本地文件的完整路径匹配关系,即使文件内容一致,也可能因路径不匹配被判定为需要同步。

修改syncFiles函数的递归调用逻辑,保持目标目录与源目录结构一致:

function syncFiles() {
  local dir="$1"
  local dest="$2"
  local queue="$3"
  # 为当前源目录创建对应的本地目标子目录
  local target_dir="$dest/$(basename "$dir")"
  mkdir -p "$target_dir"
  
  for file in "$dir"/*
  do
    if [ -d "$file" ]; then
      # 将CSV文件同步到对应子目录,而非根目录
      rsync -a --update --out-format='%n' "$file"/*key*.csv "$target_dir" >>"$queue"
      # 递归调用时,目标路径传入当前子目录的对应本地路径
      syncFiles "$file" "$target_dir" "$queue"
    fi
  done
}

2. 优化rsync参数,仅记录实际传输的文件

原脚本用rsync -av配合grep csv写入队列,会把rsync输出的所有CSV文件名(包括未传输的)都记录下来,导致队列出现重复条目。调整参数实现精准记录:

  • --update:仅同步本地不存在,或源文件比本地文件更新的文件
  • --out-format='%n':仅输出实际被传输的文件名,无需额外过滤
  • 移除-v参数,避免冗余输出干扰队列记录

3. 检查新增文件夹的文件元数据

若上述修改后仍存在重复同步,需排查远程新增文件夹内文件的元数据:

  • 检查远程文件的修改时间(mtime)是否被频繁篡改,比如源端有程序定期更新文件时间戳
  • 对比本地与远程文件的权限、所有者属性,若rsync的-a模式(包含权限、所有者同步)因权限问题无法匹配,也会触发重复同步

4. 修正脚本的其他语法问题

原脚本存在两处语法错误:

  • 写入队列时的>>"$queue缺失闭合双引号,需改为>>"$queue"
  • 主逻辑调用syncFiles时遗漏了第三个参数$queueFile,需补全为syncFiles "$foreignrepo" "$localrepo" "$queueFile"

内容的提问来源于stack exchange,提问作者PrinceRi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:03:25