rsyncスクリプトは私のNASのほとんどのファイルをどのように削除しますか?

rsyncスクリプトは私のNASのほとんどのファイルをどのように削除しますか?

だから私はフォローしています。このチュートリアルMy 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

関連情報