我使用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
答案 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