rsync에서 bash에서 변경 사항을 확인하려면 어떻게합니까?


12

원격-> 로컬 시나리오에서 rsync를 사용하여 데이터를 동기화하는 스크립트가 있습니다. rsync 명령이 실행 된 직후 오류 코드가 0인지 확인하십시오. 0이면 추가 명령이 수행됩니다. 그러나 이것은 rsync가 성공적으로 실행되었지만 실제로 변경되지 않았다는 사실을 고려하지 않습니다. 이로 인해 동일한 제로 조건이 관계없이 실행되며 약간 중복됩니다.

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에 출력을 제공 할 수 있다는 것을 읽었지만 어떻게 조건부 블록에 배치 할 수 있습니까?


당신은 -v거기에있어서, 이미 stdout하는 데 필요한 정보를 제공하고 있습니다 ... 예 : 실제로 전송 된 파일 목록. 아무것도 변경되지 않으면 그냥 ./입니다.
goldilocks

아! -v를 꺼내고 대신 -i를 사용한 다음 rsync 명령에서 비어 있지 않은 문자열 검사를 사용하면 어떻게됩니까?
제임스 화이트

해결책을 직접 찾은 것 같습니까? :-)
Bjorn Munch

2
사용할 수 있습니다 a=$("rsync command"). 이것은 실행 할 rsync명령 및 저장 stdout의를 a. 그런 다음a
nitishch

1
| grep /또는 그와 비슷한 것을 추가 한 다음 grep의 종료 상태를 확인하십시오 $?. 출력이 없으면 1이어야합니다.
Bjorn Munch

답변:


9

내 원래 질문에 대한 주석을 기반으로 -i 플래그를 사용하여 rsync 출력을 stdout으로 만들고 문자열이 아닌 검사 조건을 사용하여 오류 코드 검사 내에서 실제로 변경된 것이 있는지 확인하십시오. 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

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


1

더 엄격한 솔루션을 원했습니다. grep하고 싶지 않거나 Number of created files:(메시지가 다른 언어 일 수 있음) -v출력 에서 두 줄을 제외한 모든 줄을 제거 하고 싶습니다 (누가 rsync다음 버전에서 어떤 요약 을 인쇄 할지 알고 있습니까?).

rsync의 로그 형식을 설정할 수 있지만 stdout 형식을 설정할 수는 없습니다 (참조 man 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.