我正在设置从我们的 FreeNAS 服务器到 QNAP 服务器的基于 rsync 的备份。
该结构看起来是这样的:
Sequence
├── SHOT01
│ ├── comp
│ │ ├── work
│ | │ └── images
│ | │ ├── SHOT01
│ | │ | └── SHOT01_v001
│ | │ | ├── SHOT01_comp_v001.0001.exr
│ | │ | └── SHOT01_comp_v001.0002.exr
│ | │ └── precomp01
│ | │ └── precomp01.0001.exr
│ | ├── publish
│ | │ └── elements
│ | │ └── SHOT01
│ | │ └── SHOT01_v001
│ | │ ├── SHOT01_comp_v001.0001.exr
│ | │ └── SHOT01_comp_v001.0002.exr
│ ├── cleanup
│ │ ├── work
│ | │ └── images
│ | │ ├── SHOT01
│ | │ | └── SHOT01_v001
│ | │ | ├── SHOT01_cleanup_v001.0001.exr
│ | │ | └── SHOT01_cleanup_v001.0002.exr
我想备份所有内容,但不包括 comp/work 文件夹中的 .exr 图像序列除非它们包含在与镜头名称匹配的子文件夹中。
在此示例中,rsync 应仅排除:
.../comp/work/images/SHOT01/SHOT01_v001/SHOT01_comp_v001.0001.exr
.../comp/work/images/SHOT01/SHOT01_v001/SHOT01_comp_v001.0002.exr
也许值得注意的是,我正在 FreeNAS 中设置 rsync 任务。在配置中,它有一个名为“额外选项”的字段,我猜应该将排除参数粘贴到其中。
不太确定如何使用 rsync 来做到这一点,或者是否可行。
答案1
我不知道 FreeNAS,但它似乎有 FreeBSD,谷歌搜索似乎建议你可以创建 cron 作业并编写 shell 或可能的 bash 脚本,甚至 perl 脚本。所以还有希望。但是,GUI 是动态执行操作的糟糕地方,所以我建议你从以下小事做起。
rsync 无法处理复杂模式,因此必须在其外部创建排除文件列表。
在 rsync GUI 中添加额外选项 -F
然后,在您想要抑制文件的目录中手动创建一个文件,.rsync-filter
其中包含排除选项 ( -
)、空格和 glob 模式(*.exr
如果您想要抑制那里的所有文件):
- *.exr
rsync -F
让它在每个目录中查找文件.rsync-filter
,并将那里的所有规则应用于所有子目录。如果您只想隐藏某些文件,您可以逐行列出它们:
- SHOT01_comp_v001.0001.exr
- SHOT01_comp_v001.0002.exr
如果您没有很多符合条件的目录,这作为第一步就足够了。
下一步是设置一个 cron 作业来运行一个脚本,该脚本会扫描您的目录以查找条件并.rsync-filter
相应地创建文件。这在很大程度上取决于您的系统提供的内容,因此我仅举一个例子。如果您有find
支持正则表达式的命令,您可以使用
find comp/work -regextype posix-extended \
-regex '.*/(SHOT[^/]*)/\1_([^/]*)/\1_.*\2\..*\.exr' -print
获取名称为<1>...<2>.exr
且目录路径<1>/<1>...<2>/
为 且<1>
以 开头的所有文件的列表SHOT
。您真正想要匹配的模式不太清楚,因此这只是一个例子。显然,它需要包装到脚本中以创建文件.rsync-filter
,并放入 cron 作业中。