您可以组合--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