# 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": "2022-10-24"
}
```
