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 형식은 할 수 없다는 것을 발견했습니다 (참조rsync
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