8

我使用该选项进行备份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
4

3 回答 3

2

您可以组合--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
于 2017-01-26T14:57:23.440 回答
0

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

--exclude=BIG_DATA/

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

于 2013-10-09T15:58:21.663 回答
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
于 2018-10-01T15:40:21.003 回答