我正在编写一个脚本来使用
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/
.
谢谢你的时间:)
问题是您的“include-from”文件中的规范。
应该有 no leading / for relative path references.
请注意,“***”指的是包含的文件,而不是容器目录本身,当涉及到排除时.
此外,excludes 或 includes 需要按优先顺序呈现,哪个规则优先于后续规则,以确保那些不被忽略......因为它们可能属于前面的 include/exclude 的范围(即+图书馆/***)。
您的文件应包含以下内容:
+ Downloads/***
- Library/Application Support/***
- Library/Application Support/
- Library/Preferences/***
- Library/Preferences/
+ Library/***
- *