rsync-根据特定条件排除目录中的文件

rsync-根据特定条件排除目录中的文件

我正在设置从我们的 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 作业中。

相关内容