我想排除某个文件夹的所有内容,但要排除其部分子文件夹,并且只使用单个规则文件即可完成此操作,而无需添加--exclude
或--include
命令行选项。这可能吗?单个规则文件很重要,因为我发现它更易于维护和记录。
我运行以下命令
rsync -a -F --filter "merge backup-filter" /mnt/home/common /mnt/backup
文件backup-filter
:
# non-rooted rules take precedence
+ .git/*
+ .gitignore
- .*.sw?
# rooted rules
+ /common/backup*
- /common/opt/
+ /common/usr/
# FIXME
+ /common/root/startup/*
+ /common/root/.config/gopt/*
- /common/root/*
还有两个.rsync-filter
文件
# cat ./usr/bin/.rsync-filter
# Assume command-line option --filter=':- .gitignore', which
# backs up all file/folders that aren't listed in ./.gitignore
# cat ./usr/.rsync-filter
+ usr/bin
- */
开始于 的规则块FIXME
是损坏的部分。它旨在排除 的所有内容,但允许和/common/root
的内容被复制。它被损坏是因为和未被复制。startup
.config/gopt
startup
.config/gopt
随着时间的推移,我计划在各个级别添加更多排除路径,并添加一些包含子路径,就像我在这里为路径所做的那样/common/root
。因此规则文件将大幅增长。
答案1
你需要这个:
+ /common/root/startup/
+ /common/root/startup/*
+ /common/root/.config/
+ /common/root/.config/gopt/
+ /common/root/.config/gopt/*
- /common/root/.config/*
- /common/root/*
或者,如果您真的不想覆盖以后的特定于文件的规则,也许是这样:
+ /common/root/startup/
+ /common/root/.config/
+ /common/root/.config/gopt/
- /common/root/.config/*
- /common/root/*
问题在于它从未递归到startup
或.config
因为- /common/root/*
告诉它不要这样做。
这个版本明确指出你做想要这些目录。如果您想挑选子目录,就必须对所有父目录级别执行此操作,就像这样。
另一个技巧是包括所有目录靠近+ */
顶部,然后排除文件删除你不想要的- /common/root/**
。然后你可以用 整理空目录--prune-empty-dirs
,但要注意,这会使真实的空目录,以及您选择排除其内容的目录。