我正在尝试执行复杂的 rsync 包含/排除以仅备份/home/x
目录中的以下内容:
- 递归地所有文件/目录
Documents
- 递归地所有文件/目录
.PlayOnLinux/wineprefix/evernote/drive_c/users/x/Local Settings/Application Data/Evernote/Evernote/Databases/
我知道在使用排除规则之前需要将所有父目录包含到所需的目录。然而,正如下面我的规则文件所示,这设置效率非常低,并且完全混乱了规则文件,使其难以阅读:
+ Documents
+ Documents/**
+ .PlayOnLinux
+ .PlayOnLinux/wineprefix
+ .PlayOnLinux/wineprefix/evernote
+ .PlayOnLinux/wineprefix/evernote/drive_c
+ .PlayOnLinux/wineprefix/evernote/drive_c/users
+ .PlayOnLinux/wineprefix/evernote/drive_c/users/x
+ .PlayOnLinux/wineprefix/evernote/drive_c/users/x/Local Settings
+ .PlayOnLinux/wineprefix/evernote/drive_c/users/x/Local Settings/Application Data
+ .PlayOnLinux/wineprefix/evernote/drive_c/users/x/Local Settings/Application Data/Evernote
+ .PlayOnLinux/wineprefix/evernote/drive_c/users/x/Local Settings/Application Data/Evernote/Evernote
+ .PlayOnLinux/wineprefix/evernote/drive_c/users/x/Local Settings/Application Data/Evernote/Evernote/Databases
+ .PlayOnLinux/wineprefix/evernote/drive_c/users/x/Local Settings/Application Data/Evernote/Evernote/Databases/**
- *
这里的一切都按预期进行。但是,是否有比这更好、更有效的方法来实现仅对长路径中某些子目录的内容进行 rsync 备份,同时保留原始目录结构?
编辑我发现可以使用三个星号来包含一层深的子目录内容,而无需单独定义要包含的子目录名称(例如,+ Documents/***
可以替换上述规则中的两个相关行)。但是,这似乎不适用于深度超过一层的子目录,本问题就是这种情况。
答案1
rules="+ /Documents/**
+ /.Play...bases/**
+ */
- *"
echo $rules | rsync -rm -f ". -" --delete-excluded /home/x /dest