将目录与名称相似的文件合并时,如何确保仅替换较小+较早的文件?

将目录与名称相似的文件合并时,如何确保仅替换较小+较早的文件?

例如,如果您想要彼此合并两个目录(通过将所有内容从目录 1 移动到目录 2),并且目录 1 和目录 2 都有一些同名的文件。

那么如何编写代码,如果在两个目录中都找到 SharedFile,则将目录 2 中的 SharedFile 替换为目录 1 中的 SharedFile IF SharedFile 在目录 1 中更大SharedFile 在目录 1 中有较晚的修改日期吗? (但不要替换 SharedFile,否则)。

我对 tcsh 和 bash 脚本都很满意。

答案1

这是一个模拟 rsync 核心行为的 bash/ksh93/zsh 脚本,您可以在其中轻松调整复制或不复制源文件的决定。仅当源文件更大且更新时才会制作副本。在 bash 中,shopt -s globdots在脚本之前添加。未经测试。

target=/path/to/destination
cd source-directory
skip=
err=0
for x in **/*; do
  # Skip the contents of a directory that has been copied wholesale
  case $x in $skip/*) continue;; *) skip=;; esac
  if [[ -d $x ]]; then
    # Recreate source directory on the target.
    # Note that existing directories do not have their permissions or modification times updated.
    if [[ -e $target/$x ]]; then continue; fi
    skip=$x
    if [[ -e $target/$x ]]; then
      echo 1>&2 "Not overwriting non-directory $target/$x with a directory."
      err=1
    else
      # The directory doesn't exist on the destination, so copy it
      cp -Rp -- "$x" "$target/$x" || err=1
    fi
  elif [[ -f $x ]]; then
    # We have a regular file. Copy it over if desired.
    if [[ $x -nt $target/$x ]] && [ $(wc -c <"$x") -gt $(wc -c <"$target/$x") ]; then
      cp -p -- "$x" "$target/$" || err=1
    fi
  else
    # neither a file nor a directory. Overwrite the destination
    cp -p -- "$x" "$target/$x" || err=1
  fi
done

答案2

根据rsync --help

 -u, --update                skip files that are newer on the receiver

因此,您可能正在寻找的命令是:

rsync -auP源目录/ 目标目录/

sourcedir然后事后删除。

当然,请记住 rsync 中尾随 / 的重要性。

我不知道有 rsync 行为可以更好地对待较大的文件......

相关内容