Rsync(타임스탬프를 복사할 필요 없음)

Rsync(타임스탬프를 복사할 필요 없음)

명령을 사용하여 rsync변경된 파일/폴더를 대상 폴더에 복사/동기화하고 싶습니다. 명령을 실행할 때마다 Rsync와 같은 문제가 발생하며 rsync명령도 타임스탬프와 함께 복사됩니다.

예를 들어, 내 대상 폴더 "Linux"가 1개월 전에 업데이트되었고 내 소스 폴더에 "Linux" 폴더에 대한 업데이트 정보가 없지만 명령을 실행하면 rsync내 대상 "Linux" 폴더의 타임스탬프가 다음으로 업데이트되었습니다. 최신 소스 폴더 타임스탬프. 타임스탬프를 복사하고 싶지 않습니다. 이에 대해 저에게 제안해 주시고 제가 사용한 다음 명령을 살펴보시기 바랍니다.

rsync -avh /source/Linux/ /destination/Linux/ 

rsync -uan /source/Linux/ /destination/Linux/

rsync -uav /source/Linux/ /destination/Linux/

답변1

옵션 -a( --archive)은 -t옵션( --times, "수정 시간 유지")을 의미합니다.

--no-t이 옵션을 사용하거나 선택 취소할 수 있습니다.--no-times 뒤쪽에 -a:

rsync -a --no-t /source/Linux/ /destination/Linux/

소스 타임스탬프를 대상에 복사하지 않습니다. 그러나 rsync타임스탬프(및 기타 메타데이터)를 비교하여 파일이 업데이트되었는지 복사해야 하는지 확인합니다. 따라서 -u( --update)도 사용할 수 있습니다 .

답변2

일반적으로 말하자면, 당신은~해야 한다rsync앞으로는 더 효율적으로 실행될 것이므로 타임스탬프를 복사하세요 .

그러나 때로는 타임스탬프를 동기화하고 싶지 않을 수도 있습니다. 예를 들어, git파일의 타임스탬프는 지속적으로 변경되지만 rsync를 실행할 때 전송된 타임스탬프를 보고 싶지 않고 실제로 변경된 파일만 보고 싶을 수 있습니다.

--no-times타임스탬프 복사를 방지하지만 파일이업데이트 후 대상 파일의 수정 시간은 다음과 같이 설정됩니다.지금. 이는 이제 타임스탬프가 달라지므로 다음 타임스탬프가 rsync업데이트해야 한다고 생각하여 다시 전송된다는 의미입니다!

이를 방지하려면--ignore-times 도움이 되지 않습니다, 모든 파일이 업데이트되기 때문입니다.

당신이 할 수 있는 일은 --checksumrsync를 사용하는 것입니다. 이것은 어려운 작업이지만 원하는 작업을 수행할 것입니다. 타임스탬프를 무시하고 실제로 그런 경우에만 파일을 업데이트합니다.콘텐츠변경되었습니다.

따라서 다음과 같은 명령을 사용할 수 있습니다.

rsync -i -a --no-times --checksum /source/Linux/ /destination/Linux

대체 방법

rsync를 효율적으로 유지하려면 타임스탬프를 동기화 상태로 유지해야 합니다.

하지만 업데이트를 보고 싶지 않다면오직타임스탬프가 변경되면 출력에서 ​​이를 숨길 수 있습니다.

rsync -ai /source/Linux/ /destination/Linux |
grep --line-buffered -v '^.[fd]\.\.t\.\.\.\.\.\. '

이 접근 방식을 사용하면 ! grep가 아닌 의 종료 코드가 표시됩니다 . rsync따라서 종료 코드가 오해의 소지가 있으므로 스크립팅에 적합하지 않을 수 있습니다. 다음을 사용하여 이 문제를 해결할 수 있습니다.파이프 고장 또는 파이프 상태.

마지막으로 나는 이것을 사용했습니다.

rsync_ai_with_quiet_timestamps() {
  # This will not send timestamps, and not check timestamps, but it is slow
  #rsync -a --no-times --checksum -i "$@"

  # This will send timestamps, but hide updates which are only timestamp changes
  (
    set +e
    rsync -ai "$@" |
    grep --line-buffered -v '^.[fd][.][.]t[.][.][.][.][.][.] '
    exit "${PIPESTATUS[0]}"
  )
}

...

rsync_ai_with_quiet_timestamps /source/Linux/ /destination/Linux

관련 정보