2 个不稳定版本

0.3.0 2024 年 5 月 1 日
0.2.0 2024 年 4 月 26 日

#437 in 文件系统

Apache-2.0 OR MIT

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 用于正则表达式
  • serdermp_serde 用于MPK序列化和反序列化
  • rustyline 用于命令行解析

关于信号的抱怨

为了检测^C,我最终编写了67行的sigint_detector.rs模块,但在花费了一个美好的下午阅读signal_hook以了解为什么^C不起作用之前,我没有这么做。这并不是signal_hook的错,但在惊恐中发现它总共超过了3000行,只是为了捕获一个信号... 来吧,我并不是说没有金光闪闪、跨平台、线程和数据竞争安全信号处理的用例,但我只是想捕获一个Ctrl-C,并能够找出发生了什么,这样我就可以在不迷失在两个crate和数千行代码的迷宫中调试它。这太荒谬了。

我不怀念那些处理mallocstrlen的日子,但我确实怀念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