如何从 rsync 备份中排除交换文件?

Hea*_*283 3 shell backup rsync shell-script

我正在尝试编写一个简单的脚本来备份我的系统文件。这是我到目前为止所写的:

#!/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
Run Code Online (Sandbox Code Playgroud)

这是我的system_backup.filter文件:

# Patterns to exclude
- swapfile
- /dev/*
- /proc/*
- /sys/*
- /tmp/*
- /run/*
- /var/cache/pacman/pkg/*
- /mnt/*
- /lost+found
- /home/*
Run Code Online (Sandbox Code Playgroud)

由于某种原因,交换文件不会从备份中排除,但是我在此文件中列出的其他目录会这样做(如果我使用--dry-run第二个--verbose参数运行,我可以在日志中看到它)。如何排除交换文件?

roa*_*ima 12

过滤器文件对其空白有特殊要求。例如,在前导- (破折号、空格)之后,所有内容都是相关字符。这包括尾随空格。

\n

cat -e system_backup.filter您可以使用(不是 POSIX,但您可以使用)检查过滤器文件中是否存在此类意外的空格sed -n l system_backup.filter。下面的示例输出显示后面有一个空格字符swapfile$表示行尾):

\n
# Patterns to exclude$\n- swapfile $\n- /dev/*$\n- /proc/*$\n- /sys/*$\n- /tmp/*$\n- /run/*$\n- /var/cache/pacman/pkg/*$\n- /mnt/*$\n- /lost+found$\n- /home/*$\n
Run Code Online (Sandbox Code Playgroud)\n

另一个潜在的感兴趣字符是^M(或者\\r如果使用sed),通常位于行尾,它显示 Windows 样式的 CR/LF 行结尾。例如,

\n
- /mnt/*^M$\n
Run Code Online (Sandbox Code Playgroud)\n
\n

顺便说一句,请记住在使用变量时用双引号引起来(以防它们包含空格等)。所以在你的命令结束时rsyncrsync \xe2\x80\xa6 "$src" "$dst"

\n

  • 您可能会发现“-x”选项更方便,而不是手动排除“/dev”、“/proc”等。 (2认同)