비슷한 이름의 파일이 있는 디렉터리를 병합할 때 더 작고 오래된 파일만 교체되도록 하려면 어떻게 해야 합니까?

비슷한 이름의 파일이 있는 디렉터리를 병합할 때 더 작고 오래된 파일만 교체되도록 하려면 어떻게 해야 합니까?

예를 들어, 두 개의 디렉터리를 서로 병합하려는 경우(디렉터리 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 동작을 알지 못합니다.

관련 정보