2 个不稳定版本
0.3.0 | 2024 年 5 月 1 日 |
---|---|
0.2.0 | 2024 年 4 月 26 日 |
#437 in 文件系统
44KB
1.5K SLoC
fsmap
描述
fsmap 是一个小工具,它可以扫描 Unix 文件系统并创建文件系统内容的序列化列表(“映射”)。
内容包含目录结构、文件大小、一个时间戳(创建、访问和修改时间中最新的,分辨率为一分钟)以及符号链接。
序列化使用 serde 在 RMP 格式下进行。
- 不同的文件系统
- 硬链接
- 符号链接
然后可以将列表加载到内存中进行分析或转储。
不包括文件内容摘要。
状态
索引工作良好,搜索功能尚可,内存消耗和加载时间略高。
用例
假设您从未着手设置具有 ZFS 和索引以及快照的复杂 RAID NAS。相反,您的抽屉里有半打硬盘驱动器,内容大多静态。
您把五年前的那张特定文件放在哪里了?
是的,您运行了 find /mnt/my-twelfth-drive >index12
,但这并没有提供日期信息,也没有大小信息,使用 grep 也不是非常方便。
此工具提供了解决方案。
您为每个驱动器创建一个映射,并将它们保存在您的计算机上,这样您就可以在不插入每个驱动器的情况下搜索其内容。
搜索速度也比在实时文件系统上使用例如 find 命令快得多,并且您可以按日期、文件大小进行搜索,并使用布尔运算符。
用法
映射创建
要创建映射
fsmap collect--输出文件系统.mpk/路径/到/我的/文件系统
要限制映射到遇到的第一个文件系统,请添加 --one-device
列表
要转储映射(可选的过滤表达式 EXPR
)
fsmap dump[--表达式EXPR]文件系统.mpk
交互模式
要交互式检查映射,请输入
fsmap examine filesystem1.mpk filesystem2.mpk...
使用 ls EXPR
列出与 EXPR
匹配的条目。输入 help
获取其他命令列表。
正则表达式使用优秀的 regex crate 处理。
示例:ls mkv$
- 简单的正则表达式不需要引号 ls '\.(mkv|mp4)$'
- 如果存在某些字符,则需要单引号 ls usr/share
- 正则表达式与完整路径匹配... ls %name share
- ...除非使用了 %name
ls mkv$ & usr/share
- 可以使用 &
(和) 组合表达式 ls '\.qcow2$' | %larger 1G
- ...使用 |
(或) ls lapack \ %name ^lib
- ...使用 \
(差集) ls %after 2014-03-06 & %before 2014-03-09 & reg.*mp4
- 日期操作符 ls '(?i:\.jpeg$)'
- 不区分大小写
quit
- 退出
在列表中间您可以按^C回到提示符。
除非提供了--no-history
选项,否则命令行历史将被保存到~/.fsmap-hist
。
性能
映射文件没有任何索引(除了每个设备的inode映射);fsmap只会吞噬一切并将其保存在内存中。这可能导致许多GB。搜索性能对我来说已经足够。
索引相当大,但在我测试中可以使用xz
显著压缩到原始大小的1/6,而其他工具提供了大约2/3的减少。
计划
内置的压缩和解压缩过滤器将很有帮助。
通过在扫描时进行序列化,可以显着提高扫描性能,并且可能需要放弃Serde。
一个可映射的索引会很棒,因为加载时间很重要。
事后看来,我可能应该存储目录的时间戳。另外,取三个Unix时间戳中的最新者并不是一个好主意,因为通常文件系统是以atime
挂载的。
请随时在GitHub上提出建议。
分页输出。
将变量添加到命令语言中很有吸引力,但这也很难避免制造另一种糟糕的编程语言。
重要的第三方crate
此工具使用了以下重要的crate
regex
用于正则表达式serde
和rmp_serde
用于MPK序列化和反序列化rustyline
用于命令行解析
关于信号的抱怨
为了检测^C,我最终编写了67行的sigint_detector.rs
模块,但在花费了一个美好的下午阅读signal_hook
以了解为什么^C不起作用之前,我没有这么做。这并不是signal_hook
的错,但在惊恐中发现它总共超过了3000行,只是为了捕获一个信号... 来吧,我并不是说没有金光闪闪、跨平台、线程和数据竞争安全信号处理的用例,但我只是想捕获一个Ctrl-C,并能够找出发生了什么,这样我就可以在不迷失在两个crate和数千行代码的迷宫中调试它。这太荒谬了。
我不怀念那些处理malloc
和strlen
的日子,但我确实怀念OCaml的Unix模块(它可能甚至在Windows上大多数情况下也能工作。)
兼容性
- 在Linux上工作。
- 可能在其他Unix系统上也能工作。
- 它可能不在其他操作系统上工作,例如AmigaOS、IBM OS/2或Microsoft Windows。
许可证
随便吧。我已经包含了Apache和MIT。
作者
伯克·杜拉克 [email protected]
变更历史
- 0.3:具有表达式解析器的正确CLI
- 0.2:主要重构,从slurp重命名。
依赖项
~7–16MB
~197K SLoC