실제로 파일을 변경하기 전에 rsync가 확인을 기다립니다. 잃어 버렸습니다. 실제 파일 전송을

로컬 폴더와 원격 폴더를 동기화하고 있습니다. 바보 같은 명령으로 파일 하나를 잃어 버렸습니다.

실제 파일 전송을 수행하기 전에 일관되고 확인하는 방법 ( “go?”)에 익숙합니다.

rsync와 같은 옵션이 있습니까? (서버 측에서 일제히)

감사!



답변

공식적인 “-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 옵션을 사용하지 않고 다시 실행하십시오.


답변

–backup 옵션을 사용하여 덮어 쓸 때 백업 파일에 rsync를 만들 수 있습니다.

 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)

rsync 실행 후 backup-dir에서 파일을 스캔하고 복원이 필요한지 하나씩 물어볼 수 있습니다.


답변

안타깝게도 글을 쓰는 시점에 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/

이 스크립트는 약간 버그가있을 수 있습니다. 소스 디렉토리에 슬래시가 없으면 실제로는 마음에 들지 않습니다.


답변