rsync가 bash를 변경했는지 확인하는 방법은 무엇입니까?

rsync가 bash를 변경했는지 확인하는 방법은 무엇입니까?

rsync를 사용하여 원격 -> 로컬 시나리오에서 데이터를 동기화하는 스크립트가 있습니다. rsync 명령을 실행한 후 즉시 오류 코드가 0인지 확인하세요. 0이면 추가 명령이 실행됩니다. 그러나 이는 실제로 변경하지 않고도 rsync가 성공적으로 실행되었을 수 있다는 사실을 고려하지 않습니다. 따라서 0과 같음 조건은 어쨌든 실행되며 이는 약간 중복됩니다.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

rsync 명령 실행을 기반으로 실제로 변경 사항이 있는지 확인하기 위해 이 방법을 확장하는 가장 좋은 방법은 무엇입니까? -i 플래그가 stdout에 출력을 제공할 수 있다는 것을 읽었습니다. 하지만 이를 조건부 블록에 어떻게 배치합니까?

답변1

내 원래 질문에 대한 의견에 따라 -i 플래그를 사용하여 출력을 stdout으로 rsync하고 문자열이 아닌 검사 조건을 사용하여 오류 코드 검사에 실제 변경 사항이 있는지 확인하십시오. rsync 명령을 변수에 래핑하여 확인을 수행할 수 있습니다.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

잠재적인 단점은 자세한 출력을 잃어야 하지만 언제든지 파일에 기록할 수 있다는 것입니다.

답변2

좀 더 엄격한 해결책을 원합니다. 나는 grep을 수행하거나 Number of created files:(메시지가 다른 언어로 되어 있을 수 있음) -v출력에서 ​​두 줄만 남기고 모두 삭제하고 싶지 않습니다 ( rsync다음 버전에 어떤 요약이 인쇄될지 누가 알겠습니까?).

편집하다: a의 rsync출력 형식을 다음으로 설정할 수 있다는 것을 알았습니다.변경된 파일 나열--out-format:

rsync -a --verbose source-dir target-dir \
     --out-format='changed file: %i %n%L' \
  | fgrep 'changed file:'

또는 파일 시간은 신경 쓰지 않지만 복사를 최소화하려는 경우 확장되고 삭제된 변형을 사용할 수 있습니다 -a.

rsync -r --links --devices --specials \
      --delete --checksum \
      --omit-dir-times --omit-link-times --ignore-times \
      --prune-empty-dirs \
      --verbose \
    source-dir target-dir

이전 답변: log 형식을 지정할 수 있지만 stdout 형식은 할 수 없다는 것을 발견했습니다 (참조rsyncman rsyncd.conf).

예를 들어, 실제 변경 사항이 있는 파일의 각 줄에 "파일이 변경되었습니다!"를 추가하고 다음을 grep수행합니다.

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi

관련 정보