100 lines
4.1 KiB
Markdown
100 lines
4.1 KiB
Markdown
# l-s
|
|
|
|
为任意文件或文件夹生成和校验元数据(meta 信息)的工具。
|
|
|
|
## 使用说明
|
|
|
|
程序接受一个命令行参数,作为文件或文件夹路径。如果未提供参数,则默认处理当前目录。
|
|
|
|
元数据信息以 json 格式保存,且采用美观(pretty)打印以方便阅读。
|
|
|
|
**如果输入的是文件:**
|
|
|
|
- 元数据文件与原文件同名,仅添加 `.json` 扩展名,存放在文件所在目录下的 `meta` 子文件夹内(文件夹不存在则自动创建)。
|
|
- 若不存在相应元数据文件,则自动计算并保存。
|
|
- 若元数据文件已存在,则仅校验其中的 `xxh128` 哈希值。
|
|
- 校验通过将提示“校验通过”。
|
|
- 校验不通过时,会重新计算并输出当前元数据到标准输出,同时保留原元数据文件不变。
|
|
|
|
**如果输入的是文件夹:**
|
|
|
|
- 若不存在`meta.json`,则按字母序遍历目录树,计算全部文件元数据并写入`meta.json`。
|
|
- 若`meta.json`已存在:
|
|
- 程序会先将其重命名为`meta-old.json`,提示用户正在校验旧数据;
|
|
- 遍历当前目录结构,仅计算每个文件的`xxh128`并与旧元数据对比;
|
|
- 发现校验失败、新增或缺失的文件都会即时打印到标准输出;
|
|
- 若全部一致,则将`meta-old.json`重命名回`meta.json`;如有异常则保留`meta-old.json`供排查(不会生成新的`meta.json`)。
|
|
|
|
标准`meta.json`的格式如下:
|
|
|
|
```json
|
|
{
|
|
"dir_name": "test",
|
|
"dirs": [
|
|
{
|
|
"dir_name": "child",
|
|
"dirs": [],
|
|
"files": [
|
|
{
|
|
"basename": "233",
|
|
"size": 4,
|
|
"friendly_size": "4.00B",
|
|
"mtime": 1763654099,
|
|
"head_115": "28AAB5A575FA1138E2CE5B1366AE697685775011",
|
|
"head_baidu": "1490AAA92CB684B2110DDB29D7A1AC15",
|
|
"ed2k": "6CB03133656BDB8DFC780EBBD4FF47CC",
|
|
"md5": "9F3D9739B11C2A4B08EA48512AC467F6",
|
|
"sha1": "10E25C6EC9A30C731BF82E5DBA37BC693E9F615D",
|
|
"sha256": "5F8064636753265C7F1B1EE075DF77E1AE9BCE7E94831DE583784A0C13EB902F",
|
|
"xxh128": "B92C6051418D532F7E933C08C44C4C88"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"files": [],
|
|
"v": "2025-11-21"
|
|
}
|
|
```
|
|
|
|
字段说明:
|
|
|
|
- `basename`: 文件名
|
|
- `size`: 文件大小(字节)
|
|
- `friendly_size`: 人类可读的文件大小
|
|
- `mtime`: 文件修改时间(Unix 时间戳)
|
|
- `head_115`: 115网盘头部哈希(固定 128KB 缓冲区的 SHA1;文件不足 128KB 时尾部按 0 填充后计算)
|
|
- `head_baidu`: 百度网盘头部哈希(固定 256KB 缓冲区的 MD5;文件不足 256KB 时尾部按 0 填充后计算)
|
|
- `ed2k`: ED2K 哈希
|
|
- `md5`: MD5 哈希
|
|
- `sha1`: SHA1 哈希
|
|
- `sha256`: SHA256 哈希
|
|
- `xxh128`: XXH3-128 哈希(用于快速校验)
|
|
- `v`: 元数据格式版本号
|
|
|
|
## 其他说明
|
|
|
|
**进度显示**
|
|
|
|
处理过程中会显示实时进度条,包括当前文件名、处理速度和剩余时间等信息。
|
|
|
|
**软链接处理**
|
|
|
|
程序会自动跳过所有软链接(符号链接),不进行递归处理。
|
|
|
|
**自动排除的文件和目录**
|
|
|
|
以下条目会在扫描时跳过(与 `constants.rs` 中 `SKIP_*` 及 `should_skip_file` 规则一致):
|
|
|
|
| 系统 / 环境 | 目录名(整段跳过) | 文件名(精确匹配) | 文件名模式 |
|
|
|-------------|-------------------|-------------------|------------|
|
|
| **群晖等 NAS** | `@Recently-Snapshot`(快照)、`@Recycle`(回收站)、`.@__thumb`(缩略图缓存)、`@Transcode`(转码) | — | — |
|
|
| **Windows** | `$RECYCLE.BIN` | `Thumbs.db`、`desktop.ini` | — |
|
|
| **macOS** | — | `.DS_Store` | 以 `._` 开头(AppleDouble 资源叉) |
|
|
| **本工具** | `meta`(元数据子目录) | `meta.json`、`meta-old.json` | 以 `.l-s-tmp-` 开头的临时写入文件 |
|
|
| **兼容旧工具** | — | `licsber-bak.json` | — |
|
|
| **缩略图** | — | — | 以 `Thumb_` 开头的缩略图文件 |
|
|
|
|
**子目录递归优化**
|
|
|
|
遍历目录时,如果某个子目录下已存在 `meta.json`,程序会直接加载并快速校验该子目录的元数据,而不是重新计算所有文件。这有助于加快大型目录树的处理速度。
|