ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

rclone dedupe 命令完全指南:交互式与自动化清理重复文件名与重复内容

rclone dedupe 命令完全指南:交互式与自动化清理重复文件名与重复内容 rclone dedupe 命令完全指南交互式与自动化清理重复文件名与重复内容【免费下载链接】rclonersync for cloud storage - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rclonerclonededupe命令用于在支持重复文件名的云端存储如 Google Drive、Opendrive中交互式地查找重复文件并删除或重命名它们配合--by-hash还可跨任意支持哈希的后端按文件内容去重。阅读本文后你将掌握dedupe的两种去重模式、完整交互式会话的操作方式、全部 9 种--dedupe-mode策略以及其底层实现原理与安全防护机制。dedupe 命令定位两种不同的重复语义rclone dedupe的完整说明托管在仓库的 rclone_dedupe.md它由源码 cmd/dedupe/dedupe.go 中的 Cobra 命令定义自动生成文档头部也明确标注了其自 v1.27 版本引入。默认情况下dedupe交互式地查找同名文件并提供选项让你删除除一个之外的全部文件或将它们重命名为不同的名字这被称为deduping by name按名字去重。按名字去重只对少量允许同名文件共存的后端有意义例如 Google Drive、Opendrive。它也可以运行在包装型后端wrapping backends例如 crypt之上——前提是它包装的后端本身支持重复文件名。另一种情况如果传入--by-hashdedupe将改为查找哈希重复的文件。这种方式适用于任何支持至少一种哈希的后端可用来找出内容重复的文件这被称为deduping by hash按哈希去重。在源码 cmd/dedupe/dedupe.go 中可以看到一个关键守卫逻辑fdst : cmd.NewFsSrc(args) if !byHash !fdst.Features().DuplicateFiles { fs.Logf(fdst, Cant have duplicate names here. Perhaps you wanted --by-hash ? Continuing anyway.) }也就是说如果目标后端不具备DuplicateFiles支持重复文件名能力又没有指定--by-hash命令会打印提示这里不可能有重复名字也许你想要--by-hash但仍然继续执行。语法与命令行入口命令的标准用法如下rclone dedupe [mode] remote:path [flags]其中[mode]是可选的去重模式位置参数与使用--dedupe-mode标志等价。源码 cmd/dedupe/dedupe.go 中位置参数优先于标志被解析cmd.CheckArgs(1, 2, command, args) if len(args) 1 { err : dedupeMode.Set(args[0]) // 第一个参数作为 mode ... args args[1:] } fdst : cmd.NewFsSrc(args) // 剩余参数是 remote:path return operations.Deduplicate(context.Background(), fdst, dedupeMode, byHash)因此下面两种写法效果完全相同以重命名 Google Photos 目录下所有同名照片为例rclone dedupe --dedupe-mode rename drive:Google Photosrclone dedupe rename drive:Google Photos三步执行流程从源码 operations/dedupe.go 中的Deduplicate函数可以完整还原dedupe的执行管线分为三个阶段。阶段一合并同名目录仅按名字去重时如果按名字去重dedupe会首先合并同名目录并且会迭代执行直到所有同名目录全部合并完毕。底层实现由dedupeFindDuplicateDirs遍历列出所有目录、按 ID/父路径归类出同名目录组与dedupeMergeDuplicateDirs调用后端的MergeDirs特性完成。值得注意的细节是合并时会把内容最多的目录放到最前面以最小化移动量源码注释 Put largest directory in front to minimize movements。若后端不支持MergeDirs会直接报错cant merge directories。见 operations/dedupe.go。阶段二自动删除完全相同的文件无需确认接下来若按名字去重对每一组重复文件名/哈希dedupe会不经过确认地自动删除完全相同的文件的副本只保留一个。这意味着对大多数重复文件dedupe甚至根本不会进入交互模式。dedupe判定文件完全相同的标准是相同的文件路径 相同的哈希。如果后端不支持哈希例如 crypt 包装 Google Drive则这些文件永远不会被判定为相同。如果加上--size-only标志则只要大小相同就视为完全相同忽略一切哈希。这在 crypt 这类不支持哈希的后端上非常有用。相关逻辑在 operations/dedupe.go 的dedupeDeleteIdentical中实现。源码还展示了一个防数据丢失的保护细节if IDs[ID] 1 { newObjs append(newObjs, o) } else { fs.Logf(o, Ignoring as it appears %d times in the listing and deleting would lead to data loss, IDs[ID]) }即若某个文件 ID 在目录列表中出现了多次说明它可能被列表了多次直接删除反而可能造成数据丢失因此会被跳过。随后同一组内相同哈希/尺寸的文件会保留第一个、删除其余fs.Logf(remote, Deleting %d/%d identical duplicates (%s), len(dupes)-1, len(dupes), ID)这正好对应了示例输出中的日志Deleting 2/3 identical duplicates (MD5 1eedaa9fe86fd4b8632e2ac549403b36)。阶段三解决剩余重复文件dedupe再处理剩余的非完全相同重复文件具体动作取决于去重模式见下文。默认interactive模式下会针对每一组逐个询问用户。完整交互式实战示例以下是官方文档给出的完整演示假设远端目录已存在重复文件。去重之前——目录drive:dupes中同名文件众多$ rclone lsl drive:dupes 6048320 2016-03-05 16:23:16.798000000 one.txt 6048320 2016-03-05 16:23:11.775000000 one.txt 564374 2016-03-05 16:23:06.731000000 one.txt 6048320 2016-03-05 16:18:26.092000000 one.txt 6048320 2016-03-05 16:22:46.185000000 two.txt 1744073 2016-03-05 16:22:38.104000000 two.txt 564374 2016-03-05 16:22:52.118000000 two.txt可以看出one.txt有 4 个同名文件、two.txt有 3 个同名文件其中部分大小相同如 6048320 与 564374 各自多次出现属于完全相同的副本。执行 dedupe 会话$ rclone dedupe drive:dupes 2016/03/05 16:24:37 Google drive root dupes: Looking for duplicates using interactive mode. one.txt: Found 4 files with duplicate names one.txt: Deleting 2/3 identical duplicates (MD5 1eedaa9fe86fd4b8632e2ac549403b36) one.txt: 2 duplicates remain 1: 6048320 bytes, 2016-03-05 16:23:16.798000000, MD5 1eedaa9fe86fd4b8632e2ac549403b36 2: 564374 bytes, 2016-03-05 16:23:06.731000000, MD5 7594e7dc9fc28f727c42ee3e0749de81 s) Skip and do nothing k) Keep just one (choose which in next step) r) Rename all to be different (by changing file.jpg to file-1.jpg) s/k/r k Enter the number of the file to keep 1 one.txt: Deleted 1 extra copies two.txt: Found 3 files with duplicate names two.txt: 3 duplicates remain 1: 564374 bytes, 2016-03-05 16:22:52.118000000, MD5 7594e7dc9fc28f727c42ee3e0749de81 2: 6048320 bytes, 2016-03-05 16:22:46.185000000, MD5 1eedaa9fe86fd4b8632e2ac549403b36 3: 1744073 bytes, 2016-03-05 16:22:38.104000000, MD5 851957f7fb6f0bc4ce76be966d336802 s) Skip and do nothing k) Keep just one (choose which in next step) r) Rename all to be different (by changing file.jpg to file-1.jpg) s/k/r r two-1.txt: renamed from: two.txt two-2.txt: renamed from: two.txt two-3.txt: renamed from: two.txt去重之后——所有重名文件被保留一份、其余被重命名或删除$ rclone lsl drive:dupes 6048320 2016-03-05 16:23:16.798000000 one.txt 564374 2016-03-05 16:22:52.118000000 two-1.txt 6048320 2016-03-05 16:22:46.185000000 two-2.txt 1744073 2016-03-05 16:22:38.104000000 two-3.txt示例中的行为与源码完全对应对one.txt4 个同名文件中 3 个 MD5 完全相同1eedaa9f...因此阶段二自动Deleting 2/3 identical duplicates剩余 1 大 1 小两个不同文件进入交互菜单用户选择k保留一个并输入编号1随即删除多余副本。对two.txt3 个文件 MD5 各不相同用户选择r全部重命名输出two-1.txt: renamed from: two.txt等这正是 dedupeRename 按base-i.jpg如two-1.txt命名规则执行Move的结果且它会通过f.NewObject预先探测目标名是否已被占用并自动递增后缀最多尝试 100 次。重要由于该命令可能导致数据丢失请务必先用--dry-run或--interactive/-i进行测试。交互菜单由 fs/config/ui.go 的config.Command实现用户输入首字母s/k/r/q响应保留哪个文件的输入框由config.ChooseNumberEnter the number of the file to keep实现。按名字去重时交互选项包含r重命名若使用--by-hash交互菜单中不会出现r因为按哈希去重时文件路径本就不同重命名无意义——参见 dedupeInteractive。非交互模式--dedupe-mode 九种策略通过--dedupe-mode标志或位置参数可以让 dedupe 完全非交互运行。每种模式均遵循先删除完全相同文件再处理剩余文件的统一管线模式行为说明interactive如上面示例所示的交互模式默认值skip删除完全相同文件后对剩余重复文件一律跳过不做处理first删除完全相同文件后保留剩余重复文件中的第一个newest删除完全相同文件后保留修改时间最新的一个oldest删除完全相同文件后保留修改时间最老的一个largest删除完全相同文件后保留体积最大的一个smallest删除完全相同文件后保留体积最小的一个rename删除完全相同文件后把剩余文件全部重命名为不同名字list仅列出重复目录和重复文件不改变任何内容默认值为interactive。命令行帮助文本为Dedupe mode interactive|skip|first|newest|oldest|largest|smallest|rename见 cmd/dedupe/dedupe.go注意帮助字符串未列出list但它是合法取值之一。每种模式的取值定义与字符串解析在 operations/dedupe.go 中完成DeduplicateMode类型与Set方法大小写不敏感。模式的最终效果分支见 Deduplicate 函数first直接保留对象切片索引 0newest/oldest先按修改时间从旧到新排序sortOldestFirst再分别保留最后一个 / 第一个largest/smallest先按大小从小到大排序sortSmallestFirst再分别保留最后一个 / 第一个rename将重复文件按name-1.ext、name-2.ext递增式重命名list仅打印重复项清单skip仅记录日志Skipping %d files with duplicate names。list模式是只看不动的安全侦察手段适合在任何大规模清理前先摸清远端有哪些重名/重复文件。选项速查--by-hash Find identical hashes rather than names --dedupe-mode string Dedupe mode interactive|skip|first|newest|oldest|largest|smallest|rename (default interactive) -h, --help help for dedupe这些标志在 cmd/dedupe/dedupe.go 中注册--dedupe-mode绑定到operations.DeduplicateInteractive类型的自定义 flag实现了pflag.Value接口--by-hash为布尔 flag二者在启动时即有默认值interactive/false。此外dedupe还共享其他命令通用的重要选项-n, --dry-run Do a trial run with no permanent changes -i, --interactive Enable interactive mode -v, --verbose count Print lots more stuff (repeat for more)--dry-run 与 --interactive 的源码级防护--dry-run与--interactive之所以能防止误删是因为底层所有删除、重命名、目录合并操作都经过 operations/operations.go 的SkipDestructive防护函数switch { case ci.DryRun: flag --dry-run skip true case ci.Interactive: flag --interactive // 向用户逐一确认后才执行 ...命中--dry-run时删除/重命名/合并会被直接跳过并记录日志只做演练命中--interactive时每个破坏性动作都会弹出一个 yes/no 确认yYes/nNoEnter 使用默认值见 fs/config/ui.go源码注释对该函数的要求是subjectaction拼接起来应能组成一句 Rclone is about toactionsubject 的通顺句子例如dedupeMergeDuplicateDirs中调用SkipDestructive(ctx, dedupeDirs[0].dir, merge duplicate directories)。dedupeRename和DeleteFile同样经过该防护——删除路径最终落到DeleteFileWithBackupDir它尊重--dry-run并计入--backup-dir之外的正向统计普通删除不受--backup-dir影响见 operations/operations.go。测试覆盖可以验证的行为仓库对去重逻辑提供了自动化测试位于 fs/operations/dedupe_test.go。测试的运行前提直接反映了dedupe按名字去重的硬件需求func skipIfCantDedupe(t *testing.T, f fs.Fs) { if !f.Features().DuplicateFiles { t.Skip(Cant test deduplicate - no duplicate files possible) } if f.Features().PutUnchecked nil { t.Skip(Cant test deduplicate - no PutUnchecked) } if f.Features().MergeDirs nil { t.Skip(Cant test deduplicate - no MergeDirs) } }即被测后端必须同时具备DuplicateFiles可存在重复名、PutUnchecked无校验写入、MergeDirs目录合并三项特性。测试覆盖了DeduplicateInteractive、DeduplicateSkip、DeduplicateNewest/Oldest、DeduplicateList、DeduplicateRename以及基于内容哈希去重的场景并对支持哈希与不支持哈希的后端分别断言去重结果。常见使用场景与注意事项清理 Google Drive / Google Photos 中的重复上传Google Drive 允许同名文件反复同步或手动上传极易堆积重名文件。最安全的流程是先rclone dedupe list drive:path侦察再rclone dedupe --dedupe-mode rename drive:Google Photos或rclone dedupe rename ...将所有重名照片改成不同名字保留全部内容也可以直接跑交互模式逐组决策。清理重复内容但文件名不同的文件改用rclone dedupe --by-hash --dedupe-mode newest remote:path按内容哈希找出真正内容重复的文件并按策略保留最新副本。crypt 等不支持哈希的后端同类后端无法做内容哈希判定可加--size-only将大小相同视作完全相同从而让自动删除阶段发挥作用。任何批量清理前先--dry-run演练一遍确认影响面再结合-i/--interactive在实际删除前获得逐项确认防止不可逆的数据丢失。dedupe命令属于 rclone 命令族中的 Important 分组与其相关的其他命令用法可参考 rclone 命令总览命令帮助文本由 cmd/dedupe/dedupe.go 自动生成到 docs/content/commands/rclone_dedupe.md涉及全部重复处理的底层函数集中在 fs/operations/dedupe.go。如果你关心哪些后端允许重复文件名可以在对应后端的文档如 drive.md、mega.md与源码的特性注册中进一步核实。【免费下载链接】rclonersync for cloud storage - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rclone创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表