답변:
공식적인 "-confirm"옵션 대신에, rsync 자체의 "일괄 처리 모드"를 활용하여 두 경로의 차이를 두 배로 계산하지 않아도됩니다. 배치 모드는 변경 사항을 미러에 배포하기위한 것입니다 (한 번 계산하고 동일한 트리를 많이 업데이트). 업데이트를 포함하는 배치 파일과 업데이트를 실행하기위한 간단한 편의 스크립트라는 두 개의 파일이 생성됩니다 ( 자세한 내용 은 rsync 매뉴얼 페이지 의 끝 부분이 있습니다 ).
프로세스 추상화를위한 bash 래퍼는 다음과 같습니다.
#!/bin/bash
cleanup ()
{
rm ${BFILE} ${BFILE}.sh &>/dev/null
}
# generate tmpfile
BFILE=$( mktemp )
# rsync command
if ! rsync --only-write-batch="${BFILE}" --verbose "$@"; then
cleanup
exit 1
fi
# confirmation
read -p "Continue (y/N)? " confirm
if [ "$confirm" != "y" ]; then
echo "Aborting"
cleanup
exit 1
fi
# carve up arguments
dest="${@: -1}" # last argument
host="${dest%%:*}" # host:path
path="${dest#*:}"
opts="${@:1:$(($#-2))}" # everything but the last two args
if [ "$host" = "${path}" ]; then
# local
sh "${BFILE}.sh"
else
# remote
ssh "$host" rsync --read-batch=- "${opts}" "${path}" <"${BFILE}"
fi
cleanup
이 스크립트는에 쓰기 때문에 $TMP_DIR
실제로 큰 데이터 (예 : / tmp보다 큼)를 이동하는 경우 공간 제약 조건이 발생할 수 있습니다.
rsync와 함께 -n 옵션을 사용하여 드라이 런을 수행 할 수 있습니다. rsync는 실제로 수행하지 않고 수행 한 작업을 알려줍니다. 결과에 만족하면 -n 옵션을 사용하지 않고 다시 실행하십시오.
안타깝게도 글을 쓰는 시점에 Rsync에는 내장 메소드가 없습니다.
Mike Fitzpatrick의 솔루션은 잘 작동하지만 매우 큰 디렉토리 트리가 있으면 rsync가 모든 파일을 다시 통과하지 않는 무언가를 원할 수 있습니다.
편집 : 대상 파일을 삭제하지 않는 버그가 있습니다 ... 점점 더 많이 볼 때이 솔루션이 손상되었습니다 ... 귀하의 경우에는 효과가있을 수 있으며 누군가가 원한다면 그것을 해결하기 위해. 또한 누군가는 https://bugzilla.samba.org/enter_bug.cgi?product=rsync에 공식 기능 요청을 제출해야합니다.
나는이 스크립트를 썼다 :
#! /bin/bash
# Make a temp file for storing the output of rsync
tmpfile=$( mktemp ) &&
# Do all the hard work ( get the list of files we need to update ),
# but dont actually change the filesystem
rsync --dry-run --out-format='RSYNC_CONFIRM %i %n%L' "$@" | grep RSYNC_CONFIRM | awk '{ print $3 }' > $tmpfile &&
# Output to the user what we propose to do
rsync --dry-run --itemize-changes --files-from=$tmpfile "$@" &&
# Alternatively, we could just output $tmpfile... but whatever...
read -p "Continue? (y/n)?" &&
if [[ $REPLY = [yY] ]]
then
{
rsync --files-from=$tmpfile "$@"
}
fi
rm $tmpfile
스크립트를 파일에 붙여 넣기 rsync-confirm.bash
그때 chmod +x rsync-confirm.bash
그때 ./rsync-confirm.bash -rvh /etc/ /tmp/etc/
이 스크립트는 약간 버그가있을 수 있습니다. 소스 디렉토리에 슬래시가 없으면 실제로는 마음에 들지 않습니다.