rsync 스크립트는 내 NAS에 있는 대부분의 파일을 어떻게 삭제합니까?

rsync 스크립트는 내 NAS에 있는 대부분의 파일을 어떻게 삭제합니까?

그래서 난 팔로우 중이야이 튜토리얼내 Debian 인스턴스 백업

스크립트를 실행한 후 홈 디렉터리만 백업하도록 설정되어 있음을 확인했습니다. 루트 디렉터리에 있는 모든 것을 NAS의 디렉터리에 백업하고 싶습니다. 그래서 스크립트를 다음과 같이 수정했습니다.

#!/bin/bash

# A script to perform incremental backups using rsync

set -o errexit
set -o nounset
set -o pipefail

readonly SOURCE_DIR="/"
readonly BACKUP_DIR="/link/to/my/nas/Server Backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly EXCLUDE="/link/to/my/nas/
readonly LATEST_LINK="${BACKUP_DIR}/latest"

mkdir -p "${BACKUP_DIR}"

rsync -av --delete \
  "${SOURCE_DIR}/" \
  --link-dest "${LATEST_LINK}" \
  --exclude=".cache" \
  "${BACKUP_PATH}" \
  "${EXCLUDE}"

rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"

내 NAS에 있는 거의 모든 것이 삭제되었습니다! 나는 이것을 취소할 방법이 없다고 가정하고 있습니다. 백업이 있다고 해서 세상이 끝나는 것은 아닙니다. 그런데 여기서 정확히 무슨 일이 일어나고 있는 걸까요? ? ? 예상대로 백업되지 않는 이유는 무엇이며 LATEST_LINK 아래의 파일만 삭제하는 이유는 무엇입니까?

실행 스크립트 로그:

root:/utils# ./backup-script.sh
sending incremental file list
rsync: [sender] link_stat "/link/to/my/nas/Server Backups/2023-01-07_15:58:36" failed: No such file or directory (2)
--link-dest arg does not exist: /link/to/my/nas/Server Backups/latest
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(713) [sender=3.2.7]
rsync error: received SIGUSR1 (code 19) at main.c(1613) [generator=3.2.7]

답변1

rsync가 예상하지 못한 작업을 수행하는 이유를 설명해 보겠습니다.

이는 명령 옵션이 첫 번째이고 경로가 끝에 오도록 표준 순서로 다시 작성된 명령입니다. 이는 의미를 바꾸지는 않지만 효과를 설명하는 데 도움이 됩니다.

rsync
  -av                           # Archive mode, verbosely 
  --delete                      # Delete in destination if not in source
  --link-dest "$LATEST_LINK"    # Link unchanged files to a match by name
  --exclude ".cache"            # Exclude file/directory
  "$SOURCE_DIR/"                # Source 1
  "$BACKUP_PATH"                # Source 2
  "$EXCLUDE"                    # Destination 

분명히 당신은 --exclude "${EXCLUDE}"단지 쓰기가 아니라 쓰기를 의미합니다 "${EXCLUDE}". 불행히도 당신이 작성하고 실행하는 것은 $EXCLUDE존재하지 않는 모든 것을 삭제하거나 다운로드하는 효과를 갖습니다 .$SOURCE_DIR$BACKUP_PATH

다음은 올바르게 작성된 명령입니다.

rsync                        \
  -av                        \
  --delete                   \
  --link-dest "$LATEST_LINK" \
  --exclude ".cache"         \
  --exclude "$EXCLUDE"       \
  "$SOURCE_DIR/"             \
  "$BACKUP_PATH"

지금은 도움이 되지 않지만 나중에 참고할 수 있도록 되돌릴 수 없는 다른 작업을 적용하거나 수행하려는 경우 --dry-run() 플래그를 사용하는 것이 좋습니다. 자주 이용해요!-n--delete

관련 정보