重复文件目录分析及删除脚本

1
wget -qO- https://haies.cn/assets/deduplicate.sh

使用说明

deduplicate 是一个 Bash 脚本,用于递归分析指定目录下的重复文件和目录(内容完全相同),并根据用户选择执行删除或仅记录日志。

核心规则

  • 重复范围:仅在同一父目录下判定重复(文件和目录分开处理)
  • 遍历顺序:按目录深度从浅到深处理,先处理子目录重复,再处理文件重复
  • 保留策略:对于每个重复组,保留文件名最短且修改时间最早的一项,其余标记为待删除

自动忽略

以下项目不参与分析,也不会出现在日志中:

  • 以点(.)开头的文件和目录(隐藏项)
  • 名为 node_modulesdistbuildbindebug 的目录(不区分大小写)

日志文件

在每个待分析目录下生成独立的日志文件,文件名格式为 .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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 示例 1:仅分析单个目录(不删除)
./deduplicate /home/user/documents

#分析 `/home/user/documents` 下的重复项,结果记录到 `/home/user/documents/.deduplicate_20260228_093012.log`。屏幕显示扫描进度和发现的重复组。

# 示例 2:分析多个目录
./deduplicate /home/user/docs /home/user/backup

#分别分析两个目录,各自生成日志文件,互不影响。

# 示例 3:分析并删除重复项(无现有日志)
./deduplicate -d /mnt/data/projects

#分析 `/mnt/data/projects`,发现重复组后直接删除待删除项,日志中对应行状态从 `TO_DEL` 变为 `DELETED`。屏幕显示删除进度。

# 示例 4:已有日志情况下再次运行删除模式
#假设之前已运行分析(不带 `-d`),生成了日志文件 `.deduplicate_20260228_093012.log`,其中包含一些 `TO_DEL` 项。现在执行:
./deduplicate -d /mnt/data/projects

#脚本会自动找到该目录下最新的日志,读取其中所有 `TO_DEL` 且仍存在的项目并删除,同时将日志中对应行更新为 `DELETED`。如果日志中已无 `TO_DEL` 项,则输出提示并结束。

查看日志内容

日志文件示例片段:

1
2
3
4
[2026-02-28 09:17:07] | G001 | /mnt/d/tmp/test/xs/凡人修仙传-- 忘语 -- 2017.epub | KEEP
[2026-02-28 09:17:07] | G001 | /mnt/d/tmp/test/xs/凡人修仙传-- 忘语 -- 2017 - 副本.epub | DELETED
[2026-02-28 09:17:07] | G002 | /mnt/d/tmp/test/xs/斗罗大陆 -- 唐家三少.mobi | KEEP
[2026-02-28 09:17:07] | G002 | /mnt/d/tmp/test/xs/斗罗大陆 -- 唐家三少 - 副本.mobi | DELETED

其中 G001G002 为组ID,每个组内先显示保留项(KEEP),再按文件名升序显示已删除项(DELETED)。

附录:脚本依赖

  • Bash 4.0 或更高版本
  • 标准命令:findsortstatsedsha256sumdiffrm
  • 确保脚本具有可执行权限:chmod +x deduplicate

如有任何问题或建议,请根据实际情况调整脚本或联系脚本维护者。