我正在尝试编写一个简单的脚本来备份我的系统文件。这是我到目前为止所写的:
#!/usr/bin/sh
if [ $UID != 0 ]; then
echo "Please run me as root"
exit 1;
fi
src="/"
dest="/mnt/system_backup/"
rsync --archive \
--acls \
--xattrs \
--hard-links \
--delete \
--verbose \
--filter="merge system_backup.filter" \
$src $dest
这是我的system_backup.filter
文件:
# Patterns to exclude
- swapfile
- /dev/*
- /proc/*
- /sys/*
- /tmp/*
- /run/*
- /var/cache/pacman/pkg/*
- /mnt/*
- /lost+found
- /home/*
由于某种原因,交换文件不会从备份中排除,但是我在此文件中列出的其他目录会这样做(如果我--dry-run
使用第二个--verbose
参数运行,我可以在日志中看到它)。如何排除交换文件?
答案1
过滤器文件对其空白有特殊要求。例如,在前导-
(破折号、空格)之后一切是一个相关的字符。这包括尾随空格。
cat -e system_backup.filter
您可以使用(不是 POSIX,但您可以使用sed -n l system_backup.filter
)检查过滤器文件中是否存在此类意外的空格。下面的示例输出显示后面有一个空格字符swapfile
($
表示行尾):
# Patterns to exclude$
- swapfile $
- /dev/*$
- /proc/*$
- /sys/*$
- /tmp/*$
- /run/*$
- /var/cache/pacman/pkg/*$
- /mnt/*$
- /lost+found$
- /home/*$
另一个潜在的感兴趣字符是^M
(或者\r
如果使用sed
),通常位于行尾,它显示 Windows 样式的 CR/LF 行结尾。例如,
- /mnt/*^M$
顺便说一句,请记住在使用变量时用双引号引起来(以防它们包含空格等)。所以在你的命令结束时rsync
,rsync … "$src" "$dst"