rsync:仅包含特定目录并不总是有效

问题描述 投票:0回答:1

我正在编写一个脚本来使用

rsync
创建增量备份。我有一个包含文件,只包含子目录的特定目录。其余的应该排除在外。对于我正在测试的源目录,一切都按预期工作,但当我尝试将我的文件实际备份到我的外部驱动器时却没有。

到目前为止,这是脚本:

SOURCE_DIR="$HOME/"
DEST_DIR="/Volumes/Stuff/Backup/"

if [ ! -d "$SOURCE_DIR" ]; then
    echo "\"${SOURCE_DIR}\" does not exist."; exit
elif [ ! -d "$DEST_DIR" ]; then
    echo "\"${DEST_DIR}\" does not exist."; exit
fi

PARENT_DIR="$(cd "$(dirname "$0")"; pwd)"
DIR_NAME="$(date '+%Y%m%dT%H%M%S')"
BACKUP_DIR="$DEST_DIR/$DIR_NAME"
LATEST_LINK="$DEST_DIR/latest"
INCLUDE_FILE="$PARENT_DIR/include.txt"

mkdir -p "$BACKUP_DIR"

rsync -av \
  --delete \
  --prune-empty-dirs \
  --include-from="$INCLUDE_FILE" \
  --link-dest="$LATEST_LINK" \
  "$SOURCE_DIR" \
  "$BACKUP_DIR"

rm -f "$LATEST_LINK"
ln -s "$BACKUP_DIR" "$LATEST_LINK"

echo "Size of current backup:" "$(du -sh "$BACKUP_DIR")"
echo "Size of all backups:" "$(du -sh "$DEST_DIR")"

文件

include.txt
包含以下内容:

- .DS_Store
- /Downloads/
+ /Library/
+ /Library/Application Support/***
+ /Library/Preferences/***
- /Library/***  

include.txt
中的路径是相对于我假设的源目录。基本上我想备份我的主目录,但排除
Downloads
Library
中的所有内容,除了它的子目录
Application Support
Preferences
.

我已经搜索了一个答案,据我所知,有些人有类似的问题,但包含文件看起来没问题。它适用于测试目录。我哪里错了?

我预计

Downloads
Library
中的所有内容,除了它的子目录
Application Support
Preferences
被排除在外,但它们总是被包括在内。我改变了
includes.txt
,因为起初它根本不起作用。现在,当我从
$HOME/backup/test-source/
备份到
$HOME/backup/test-dest
时它确实有效,但当我真正想要从
$HOME/
备份到
/Volumes/Stuff/Backup/
.

谢谢你的时间:)

bash backup rsync
1个回答
0
投票

问题是您的“include-from”文件中的规范。

应该有 no leading / for relative path references.

请注意,“***”指的是包含的文件,而不是容器目录本身,当涉及到排除时.

此外,excludes 或 includes 需要按优先顺序呈现,哪个规则优先于后续规则,以确保那些不被忽略......因为它们可能属于前面的 include/exclude 的范围(即+图书馆/***)。

您的文件应包含以下内容:

+ Downloads/***
- Library/Application Support/***
- Library/Application Support/
- Library/Preferences/***
- Library/Preferences/
+ Library/***
- *
© www.soinside.com 2019 - 2024. All rights reserved.