一个强大且智能的 Rust 工具,专门用于整理和归档 iPhone 照片库中的 Live Photos。
这个工具可以精确识别成对的 Live Photo(图片+视频),修复因系统导入或重命名导致的名称不匹配问题,并将所有非 Live Photo 文件、孤立文件以及重复版本的 Live Photo 进行分层归档,最终让您的主照片库 (100APPLE) 保持绝对的整洁。
- 精确配对: 通过文件名和修改日期,精确识别
HEIC/JPG + MOV的 Live Photo 对。 - 智能修复: 自动修复因文件名后缀(如
IMG_1234 2.MOV和IMG_1234.HEIC)导致的不匹配问题,通过比较文件名长度智能重命名,确保配对成功。 - 分层归档:
- 主文件夹 (
100APPLE): 最终只保留最原始、最干净的 Live Photo 版本。 - 版本文件夹 (
101APPLE,102APPLE, ...): 自动创建并归档后续重复或编辑产生的 Live Photo 新版本,每个版本占用一个文件夹,清晰明了。 - 隔离文件夹 (
Other,Other1, ...): 所有无法配对的孤立文件、非 Live Photo 文件(如截图、普通视频)以及系统临时文件,都会被隔离到此,并自动处理冲突。
- 主文件夹 (
- 安全可靠: 所有移动操作都经过冲突检查,确保不会覆盖任何文件。
- 高性能: 基于 Rust 语言开发,文件处理速度极快,轻松应对数万张照片。
本工具的整理过程分为两个核心阶段:
此阶段的目标是清理主文件夹 (100APPLE),只保留被识别为 Live Photo 的文件对。
-
精确匹配 (规则 A):
- 对于
100APPLE中的每一个.MOV文件,程序会寻找一个同名且修改日期完全一致的.HEIC或.JPG文件。 - 如果找到,这对文件被视为一个完美的 Live Photo,将被保留。
- 对于
-
模糊匹配与智能修复 (规则 B):
- 如果精确匹配失败,程序会进入更智能的修复模式。
- 前置检查: 只对文件名以
IMG_开头且长度至少为8的.MOV文件进行此操作。 - 寻找候选者: 提取
.MOV文件名的前8位 (IMG_XXXX) 作为“前缀”,然后在所有图片文件中寻找修改日期相同且前8位前缀也相同的唯一候选图片。 - 智能修复: 如果找到唯一的候选图片,程序会比较
.MOV和图片的文件名长度,并将较短的一方重命名,使其与较长的一方文件名完全一致。- 示例:
IMG_1234 2.MOV(长) 和IMG_1234.HEIC(短) 配对成功,程序会自动将IMG_1234.HEIC重命名为IMG_1234 2.HEIC。
- 示例:
- 这对被修复的文件也被视为 Live Photo,将被保留。
-
清理:
- 在完成所有配对和修复后,所有未被加入“保留列表”的文件(包括孤立文件、普通照片/视频、系统文件等)都将被移动到
Other系列文件夹中。 - 如果
Other文件夹中已存在同名文件,程序会自动创建Other1,Other2... 来存放,确保万无一失。
- 在完成所有配对和修复后,所有未被加入“保留列表”的文件(包括孤立文件、普通照片/视频、系统文件等)都将被移动到
此阶段的目标是处理阶段一结束后 100APPLE 中仍然存在的、带后缀的 Live Photo(即被修复过的文件),将它们迁移到独立的版本文件夹中。
-
识别版本文件: 程序会遍历
100APPLE中所有文件名长度大于8个字符的 Live Photo 对(例如IMG_1234 2.MOV+IMG_1234 2.HEIC)。 -
寻找可用槽位:
- 对于每一个版本文件对,程序会提取其前缀
IMG_XXXX。 - 然后从
100APPLE文件夹开始,检查是否存在一个名为IMG_XXXX.mov的文件。 - 如果不存在: 说明
100APPLE就是存放这个原始版本的最佳位置。程序会将IMG_1234 2.MOV和IMG_1234 2.HEIC分别重命名为IMG_1234.mov和IMG_1234.heic并留在100APPLE中。 - 如果存在: 说明原始版本已被占用。程序会继续检查
101APPLE文件夹中是否存在IMG_XXXX.mov。如果不存在,就将文件对重命名后移入101APPLE;如果还存在,就继续检查102APPLE,以此类推。
- 对于每一个版本文件对,程序会提取其前缀
-
最终结果:
100APPLE: 只存放最原始的、文件名最短的 Live Photo。101APPLE,102APPLE, ...: 存放后续的版本,每个版本一个文件夹。
- 安装 Rust: 如果您还未安装 Rust,请访问 rust-lang.org 并按照指引进行安装。
- 下载代码: 使用 Git 克隆本仓库到您的电脑上。
git clone https://github.com/SCslope/livephoto-filter.git cd livephoto-filter
打开项目中的 src/main.rs 文件 。
在文件顶部的 main 函数内,找到“用户配置区域”,并根据您的实际情况修改文件夹路径。
// --- 用户配置区域 ---
let base_dir = Path::new("/Volumes/LY/DCIM/100APPLE"); // 您的主照片文件夹
let other_dir = Path::new("/Volumes/LY/DCIM/Other"); // 基础的隔离文件夹
let versioned_base_path = Path::new("/Volumes/LY/DCIM/"); // 用于创建 10XAPPLE 和 OtherX 的父目录
// --------------------在项目的根目录(livephoto-filter 文件夹)打开终端。
运行以下命令来编译并执行程序。使用 --release 参数可以获得最佳性能。
cargo run --release程序会开始执行,并在终端打印出各个阶段的进度和最终的总结报告,包括修复了哪些文件以及各个文件夹的文件总数。
100APPLE: 现在只包含最原始的 Live Photo 文件对。101APPLE, 102APPLE, ...: 如果有,这些文件夹将包含后续版本的 Live Photo。Other, Other1, Other2, ...: 包含所有未配对的孤立文件和非 Live Photo 文件。