DrJosh9000/zzglob
GitHub: DrJosh9000/zzglob
一个基于状态机的 Go glob 库,提供比标准库更丰富的模式语法和更高效的目录遍历能力。
Stars: 7 | Forks: 1
# zzglob
[](https://pkg.go.dev/drjosh.dev/zzglob)
[](https://buildkite.com/drjosh9000/zzglob)
一个更好的 Go glob 库
## 目标
* ✅ 以确定的顺序进行 Glob,就像 `fs.WalkDir` 那样。
* ✅ 支持像 `?` 和 `*` 这样的经典语法,也支持
诸如 `**`、`{x,y,z}`、`[abc]` 和 `[^abc]` 等现代便捷语法。
* ✅ 将 `~` 展开为当前用户的家目录。
* ✅ 可选地遍历目录软链接。
* ✅ 避免不必要的目录遍历 -
对 `foo*/bar` 进行 glob 匹配时应该只遍历以 `foo` 开头的目录,
而不是其他目录。
* ✅ 将遍历错误(例如权限错误)传递给
回调函数。
* ✅ 支持对任何 `io.FS` 进行 glob 匹配,而不仅限于
宿主文件系统。
* ✅ 支持在 Windows 上默认使用 Windows 风格的
路径进行 glob 匹配。
此外,实现代码不应完全难以理解。它基于
状态机,并且我已经尝试清晰地将各个解析阶段分离开来。
你可以将模式转换为 GraphViz 格式,然后通过调用
`Pattern.WriteDot` 将其转换为图表。`zzglob` 包含了一个名为 `zzdot` 的工具,
它可以为你完成这项工作,例如:
```
go run ./cmd/zzdot '[abcd]{*g,h*,i/j}/**/k' | dot -Tsvg > example.svg
```

## 进行中
* ⌚️ 改进测试。
* 🧠 添加对
[更多语法](https://www.digitalocean.com/community/tools/glob)的支持
## 模式语法
* `\` - 用于转义模式中的下一个字符。`\x` 匹配 `x`,`\*`
匹配 `*`。
* `/` - 路径分隔符。分隔每个路径的片段。
仅匹配它自身。
* `?` - 精确匹配一个字符,不包含 `/`。
* `*` - 匹配零个或多个字符,不包含 `/`。
* `**` - 匹配零个或多个字符,包含 `/`。由于它可以用于
表示零个或多个路径组件,因此 `/**/` 也能匹配 `/`。
* `{a,b,c}` - 匹配 `a` 或 `b` 或 `c`。组件可以为空,例如 `{,a,b}`
匹配空字符串、`a` 或 `b`。多个路径片段、`*`、`**` 等
在 `{}` 内都是允许的。要在 `{}` 内指定包含 `,` 的路径,
请对其进行转义(`\,`)。
* `[abc]` - 匹配单个字符(`a` 或 `b` 或 `c`)。`[]` 是一种比 `{}`
更简短的单字符匹配写法。
* `~` - 展开为当前用户的家目录。
每个语法元素都可以在调用
`Parse` 时单独启用或禁用,并且正斜杠和反斜杠的含义可以互换
(在 Windows 上默认启用):
```
pattern, err := zzglob.Parse(`C:\Windows\Media\*.mid`,
zzglob.ExpandTilde(false),
zzglob.SwapSlashes(true),
zzglob.AllowEscaping(false),
)
```
类似地,可以将软链接遍历、斜杠转换和自定义的 `fs.FS`
传递给 `Glob`:
```
err := pattern.Glob(myWalkDirFunc,
zzglob.TraverseSymlinks(false),
zzglob.TranslateSlashes(true),
zzglob.WithFilesystem(os.DirFS("/secrets/")),
)
```
标签:EVTX分析, Glob, Go, Ruby工具, SOC Prime, 开发工具, 文件系统, 日志审计, 路径匹配