重复文件目录分析及删除脚本
1 | wget -qO- https://haies.cn/assets/deduplicate.sh |
使用说明
deduplicate 是一个 Bash 脚本,用于递归分析指定目录下的重复文件和目录(内容完全相同),并根据用户选择执行删除或仅记录日志。
核心规则
- 重复范围:仅在同一父目录下判定重复(文件和目录分开处理)
- 遍历顺序:按目录深度从浅到深处理,先处理子目录重复,再处理文件重复
- 保留策略:对于每个重复组,保留文件名最短且修改时间最早的一项,其余标记为待删除
自动忽略
以下项目不参与分析,也不会出现在日志中:
- 以点(
.)开头的文件和目录(隐藏项) - 名为
node_modules、dist、build、bin、debug的目录(不区分大小写)
日志文件
在每个待分析目录下生成独立的日志文件,文件名格式为 .deduplicate_YYYYMMDD_HHMMSS.log。
日志仅记录重复项,每行格式为:
1 | [时间戳] | 组ID | 绝对路径 | 状态 |
状态包括 KEEP(保留)、TO_DEL(待删除)、DELETED(已删除)。
删除模式
通过 -d 选项启用。如果指定目录下已有脚本生成的日志,则直接读取日志中状态为 TO_DEL 且仍存在的项目并执行删除,同时将对应日志行状态更新为 DELETED(不新增行)。如果无日志,则正常分析并直接删除重复项,同样只更新原日志行状态。
注意事项
⚠️ 删除不可恢复:脚本使用 rm -rf 直接删除文件和目录,请务必先备份重要数据,并在测试环境中验证脚本行为。
- 权限要求:脚本需要对待分析目录具有读取和执行权限,对需删除项具有写权限
- 性能提示:目录重复检测依赖
diff -rq,对于包含大量文件的目录可能较慢,请耐心等待 - 日志积累:日志文件会永久保留,每次运行会生成新日志。删除模式下,多次运行可复用已有日志,仅更新状态
基本用法
1 | deduplicate [-d] dir1 [dir2 ...] |
-d:可选参数,启用删除模式。不加此参数时,仅将重复项记录到日志,不执行任何删除。dir1 dir2 ...:必需参数,至少指定一个待分析的目录(绝对路径或相对路径均可)。
脚本会对每个目录独立处理,生成各自的日志文件。
使用示例
1 | # 示例 1:仅分析单个目录(不删除) |
查看日志内容
日志文件示例片段:
1 | [2026-02-28 09:17:07] | G001 | /mnt/d/tmp/test/xs/凡人修仙传-- 忘语 -- 2017.epub | KEEP |
其中 G001、G002 为组ID,每个组内先显示保留项(KEEP),再按文件名升序显示已删除项(DELETED)。
附录:脚本依赖
- Bash 4.0 或更高版本
- 标准命令:
find、sort、stat、sed、sha256sum、diff、rm等 - 确保脚本具有可执行权限:
chmod +x deduplicate
如有任何问题或建议,请根据实际情况调整脚本或联系脚本维护者。