변경 사항이 감지된 경우에만 rsync를 사용하여 파일 버전을 생성하시겠습니까?

변경 사항이 감지된 경우에만 rsync를 사용하여 파일 버전을 생성하시겠습니까?

저는 최근 시스템의 일부 파일을 버전 관리/백업하는 수단으로 rsync를 사용하려고 했습니다.

내 목표는 본질적으로 일부 특정 파일을 감시하도록 rsync를 설정하고 해당 파일이 rysnc로 변경되면 해당 파일을 초기 백업 파일을 덮어쓰는 대신 별도의 파일로 다른 대상에 복사하는 것입니다.

현재 내가 가지고 있는 것은 다음과 같습니다.

rsync ~/Database/original.sqlite ~/Backup/backup`date +'.%F_%H-%M-%S'`.sqlite

1분 타이머로 실행되는 에이전트로 실행 중입니다. 따라서 현재로서는 rsync는 기본적으로 무슨 일이 있어도 매분마다 파일의 새 복사본을 계속 만듭니다.

rsync가 백업 폴더의 최신 버전을 확인하고 데이터베이스 폴더의 원본 파일과 비교한 다음 파일이 다르면 새 백업 버전을 생성할 수 있는 방법이 있으면 완벽할 것입니다.

정말 rsync의 한계를 확장하고 있는 걸까요?

어떤 조언이라도 미리 감사드립니다.

답변1

항상 실행된다면 가장 간단한 해결책은 파일이 마지막 순간에 편집되었는지 확인하고 그렇다면 백업을 만드는 것입니다.

#!/bin/bash

# get current time
now="$(date +'%s')"

# get modification time of fime
modified="$(stat -c '%Y' ~/Database/original.sqlite)"

# check if modified in the last minute
if (( modified > (now - 60) )) ; then
    rsync ~/Database/original.sqlite ~/Backup/backup`date +'.%F_%H-%M-%S'`.sqlite
fi

매우 강력한 백업을 원할 경우 마지막 백업의 이름이나 타임스탬프를 파일에 기록한 다음 확인할 수 있습니다. 하지만 더 쉽게 만들고 싶은지 확실하지 않습니다.

또 다른 옵션은 스크립트 자체가 1분마다 한 번씩 트리거하고 시작 시 한 번 백그라운드에서 실행되도록 하는 것입니다. 그러면 스크립트는 마지막 수정 시간 자체를 추적할 수 있습니다.

#!/bin/bash

# initialize last backup at 0
lastbackup=0
while true ; do

    # get modification time
    modified="$(stat -c '%Y' ~/Database/original.sqlite)"

    # check to see if it's been changed
    if (( modified > lastbackup )) ; then

        # do backup
        rsync ~/Database/original.sqlite ~/Backup/backup`date +'.%F_%H-%M-%S'`.sqlite

        # set the variable to its current modification time
        lastbackup="$modified"

    fi
done

답변2

다음을 사용할 수 있습니다.

rsync -au ~/Database/original.sqlite ~/Backup/

-u 옵션은 다음을 의미합니다.

--update, -u 수신기에서 최신 파일 건너뛰기

따라서 rsync는 소스 폴더의 파일이 최신인 경우에만 대상 폴더의 파일을 덮어씁니다.

그럼 넌 할 수 있어변경 사항 모니터링대상 폴더의 특정 파일을 선택하고 필요한 경우 복사합니다.

- 갱신 -

파일의 변경 사항을 모니터링하려면 다음 스크립트의 줄을 따라 작업을 수행할 수 있습니다(링크된 질문에서 수정됨). 이를 위해서는 inotify-tools( sudo apt install inotify-tools우분투에서)

#! /bin/bash

f=~/Backup/original.sqlite
touch $f

inotifywait -m -e modify "$f" --format "%e" | while read -r event; do
    if [ "$event" == "MODIFY" ]; then
        prev="$curr"
        curr=$(<"$f")
        [ "$curr" == "$prev" ] || echo "$f changed: do something"
    fi
done

스크립트를 실행하면 변경 사항이 감시됩니다. 이 스크립트는 echo "$f changed: do something"단지 예일 뿐이지만 원하는 대로 적용할 수 있습니다. 예를 들어 cp $f destination_file.

관련 정보