同じ名前のファイルを含むディレクトリをマージするときに、より小さく古いファイルのみを置き換えるにはどうすればよいですか?

同じ名前のファイルを含むディレクトリをマージするときに、より小さく古いファイルのみを置き換えるにはどうすればよいですか?

たとえば、2つのディレクトリを互いにマージしたい場合(ディレクトリ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の動作を知りません。

関連情報