Rsync:组合'--files-from'和'--exclude'不起作用

时间:2013-05-06 08:04:14

标签: rsync

我使用rsync进行备份,并使用选项--files-from来定义应同步的目录列表。现在,我计划通过--exclude选项扩展命令,但它不起作用。

更具体地说,include-list.txt文件已包含目录/home/user/shared/,我想要排除新的子目录/home/user/shared/BIG_DATA/

这是不能完成工作的命令。

rsync -azvvr \
    --files-from '/home/user/BACKUP_MNGMT/include-list.txt' \
    --exclude '/home/user/BACKUP_MNGMT/exclude-list.txt' \
    -e ssh / user@server:/home/user/Backup

3 个答案:

答案 0 :(得分:1)

您可以合并--files-from--exclude,但这并不像人们想象的那么简单。 (TL; DR?跳到最后。)

考虑一个简单的例子。这是设置

mkdir -p dst src/a src/b/c
n=1
for d in $(find src -type d)
do
    ps -ef > "$d"/file$n.txt
    n=$((n+1))
done

结果是这个目录树,我们将用它们作为例子:

src/file1.txt
src/a/file2.txt
src/b/file3.txt
src/b/c/file4.txt

在琐碎的情况下使用rsync,我们可以按预期获得所有内容:

rsync -av --dry-run src/ dst/
file1.txt
a/
a/file2.txt
b/
b/file3.txt
b/c/
b/c/file4.txt

使用rsync --exclude b,您可以看到我们已成功排除b。这里实际发生的是因为b不再被考虑,b下面的文件都没有被找到或复制:

rsync -av --dry-run --exclude b/ src/ dst/
file1.txt
a/
a/file2.txt

问题在于,当您提供包含b下的条目的文件列表时,会应用b本身的排除,但其下方的文件与--exclude b子句不匹配因此包括在内:

find src | rsync -av --dry-run --files-from=- --exclude b/ . dst/
src/
src/file1.txt
src/a/
src/a/file2.txt
src/b/
src/b/file3.txt
src/b/c/
src/b/c/file4.txt

解决方案是在--exclude子句中指定不仅要b,还要排除其所有后代:

find src | rsync -av --dry-run --files-from=- --exclude b/ --exclude 'b/**' . dst/
src/
src/file1.txt
src/a/
src/a/file2.txt

在您的情况下,您的命令也存在许多其他问题。以下是一些可能有效的变体,具体取决于文件列表中的实际内容:

rsync -azvv --no-r \
    --include-from '/home/user/BACKUP_MNGMT/include-list.txt' \
    --exclude-from '/home/user/BACKUP_MNGMT/exclude-list.txt' \
    -e ssh / user@server:/home/user/Backup

rsync -azvv \
    --files-from '/home/user/BACKUP_MNGMT/include-list.txt' \
    --exclude '/home/user/shared/BIG_DATA/**' \
    -e ssh / user@server:/home/user/Backup

答案 1 :(得分:0)

这是一个老问题,但无论如何:)

--exclude=BIG_DATA/

在这种情况下应该做的伎俩。 不要忘记尾随的斜线......

答案 2 :(得分:0)

有些事情要考虑:

  • 首先,您必须决定使用--exclude=(在命令中指定规则)或--exclude-from=(读取包含排除规则的文件)。
  • 确定应排除的内容...可能是名称为BIG_DATA的所有内容,所有名称为BIG_DATA/的文件夹,或仅是同步文件夹中的文件夹/home/user/shared/BIG_DATA/
  • /开头的文件/文件夹/规则通常从源根目录而不是系统根目录开始。
    无需开头/,他们可以无处不在。
  • 最后一个适用于文件/文件夹的规则为准。

因此,您使用--exclude=的命令(仅排除了一个文件夹)可能类似于

rsync -azvvr --files-from='/home/user/BACKUP_MNGMT/include-list.txt' --exclude='/home/user/shared/BIG_DATA/' -e ssh / user@server:/home/user/Backup

--exclude-from=

rsync -azvvr --files-from='/home/user/BACKUP_MNGMT/include-list.txt' --exclude-from='/home/user/BACKUP_MNGMT/exclude-list.txt' -e ssh / user@server:/home/user/Backup