5 个版本

0.1.5 2024年6月21日
0.1.4 2023年9月28日
0.1.2 2021年3月19日
0.1.1 2019年8月28日
0.1.0 2019年5月24日

#75命令行工具

Download history 93/week @ 2024-06-15 44/week @ 2024-06-22 5/week @ 2024-06-29

每月238次下载

GPL-3.0-or-later

36KB
592 代码行

unionfarm

这是一个用于管理符号链接农场的小型实用工具。它接受一个“农场”目录和任意数量的“数据”目录,并通过在农场目录中放置指向数据目录的符号链接来创建(或更新)数据目录的联合(或覆盖)。

它与

  • 联合挂载(overlay/overlayfs)类似--但无需系统权限;它不是实时的,但如果出现重复文件,则可以出错,而不是选择最高排名

  • (x)stow--但是当作为源时,symlink farms存在错误(参见图 https://sourceforge.net/p/xstow/bugs/8/)。与 stow 不同,它始终接受要安装的数据目录的完整列表(在 stow 中称为“包”),删除已从源中消失的文件,并在与任何源不相关的文件上出错(或根据命令行标志显示警告)。

示例

$ tree my-photos
my-photos
├── 2018/
   └── Rome/
       └── ...
└── 2019/
    └── Helsinki/
        └── DSCN2305.jpg

假设你有一组如上所示的相片,并想看到它们与朋友的相片叠加

$ tree ~friend/photos
/home/friend/photos
├── 2018/
   └── Amsterdam/
       └── ...
└── 2019/
    └── Helsinki/
        └── DSC_0815.jpg

使用 unionfarm,你可以创建一个共享视图

$ unionfarm all-photos my-photos ~friend/photos
$ tree all-photos
all-photos
├── 2018/
   ├── Amsterdam -> /home/friend/photos/2018/Amsterdam/
│   └── Rome -> ../../my-photos/2018/Rome/
└── 2019/
    └── Helsinki/
        ├── DSC_0815.jpg -> /home/friend/photos/2019/Helsinki/DSC_0815.jpg
        └── DSCN2305.jpg -> ../../../my-photos/2019/Helsinki/DSCN2305.jpg

安装

unionfarm 程序需要安装一个相对较新的 Rust 工具链(目前没有定义最低版本)。然后,可以使用以下方式从 Rust 包仓库 crates.io 安装它:

$ cargo install unionfarm

实现

本程序力求

  • 正确
  • 易于维护,并且
  • 高效

按此顺序。正确性意味着不会删除任何可能不是已删除数据源条目(即,它只会删除目标以自身路径相对于农场结束的符号链接),并尽可能少地创建符号链接(即使有两个数据源中曾经有 a/,其中一个数据源被删除,农场的 a/ 也会被删除并转换为符号链接)。

维护的容易性胜过效率意味着不努力使用标准库中尚未提供的文件系统机制,如使用 statx 系统调用,传递文件描述符以允许 openat(如果这在大型目录存在的情况下能正常工作),或并行化执行。

此程序不递归于堆栈,而保持未完成的路径待办事项列表。它将文件系统访问操作的数量保持在合理的最低限度,以满足其任务。

当程序成功运行完成且自启动以来既没有更改农场也没有更改数据时,第二次调用不会引起任何文件系统写入。如果第一次调用不成功(例如,由于农场中存在未识别的文件而中断),则可能引起文件系统写入,因为文件操作序列不一定具有确定性。(将来可能会更改实现以收集此类错误,只有在没有其他事情可做时才终止。)

该程序可以按需提供详细日志,并在错误(包括运行期间由于文件系统更改引起的问题)上显示有意义的消息,而不是简单地恐慌。

注意事项

  • 农场目录不能有尾随的正斜杠。这通常不是问题,但斜杠会破坏程序直接将农场指向单个现有数据目录或删除此类符号链接的能力。

该项目发布在Codeberg上,网址为https://codeberg.org/chrysn/unionfarm;那里也托管问题跟踪器和自动化测试。

由chrysn [email protected] 编写,并按GPLv3+条款发布。

依赖关系

约4.5–6MB
约106K SLoC