실제로 파일을 변경하기 전에 rsync가 확인을 기다립니다.


11

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

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

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

감사!

답변:


3

공식적인 "-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보다 큼)를 이동하는 경우 공간 제약 조건이 발생할 수 있습니다.


1
각 파일에 대한 확인을 요청합니까?
매우 불규칙한

2
아니요, 변경 내용을 계산하여 표시 한 다음 "계속 (y / N)?"이라는 단일 프롬프트가 표시됩니다. 내가 이것을 사용한지 오래되었지만, rRC는 여전히 rrd를 rdiff로 다시 계산하는 것처럼 보였습니다.
Steve

7

rsync와 함께 -n 옵션을 사용하여 드라이 런을 수행 할 수 있습니다. rsync는 실제로 수행하지 않고 수행 한 작업을 알려줍니다. 결과에 만족하면 -n 옵션을 사용하지 않고 다시 실행하십시오.


7

--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에서 파일을 스캔하고 복원이 필요한지 하나씩 물어볼 수 있습니다.


5

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.