rsync 仅使用一个规则文件,以递归方式排除某些路径但包含其中选定的子路径

rsync 仅使用一个规则文件,以递归方式排除某些路径但包含其中选定的子路径

我想排除某个文件夹的所有内容,但要排除其部分子文件夹,并且只使用单个规则文件即可完成此操作,而无需添加--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/goptstartup.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,但要注意,这会使真实的空目录,以及您选择排除其内容的目录。

相关内容