ARTICLE DETAIL

资讯详情

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

dupeGuru 偏好设置完全指南:扫描类型、匹配阈值与复制移动策略详解

dupeGuru 偏好设置完全指南:扫描类型、匹配阈值与复制移动策略详解 桌面应用【免费下载链接】dupeguruFind duplicate files项目地址https://gitcode.com/gh_mirrors/du/dupeguru点击查看免费下载导读dupeGuru 是一款跨平台的开源重复文件查找工具其查找行为按文件名模糊匹配还是按内容精确匹配、相似度阈值多高、是否允许混合扩展名、复制移动时如何重建路径等几乎全部由偏好设置Preferences决定。本文以项目官方文档 help/ru/preferences.rst 为主线结合core/与qt/下的源码实现逐项拆解 dupeGuru 三个版本标准版 SE、音乐版 ME、图片版 PE的偏好选项、底层匹配算法与配置持久化机制。读完本文你将能精准调校出符合自己需求的查重策略并理解每个选项在源码中的真实作用路径。1. 偏好设置的整体架构在 Qt 界面中偏好设置对话框由 qt/preferences_dialog.py 的PreferencesDialogBase构建按通用 / 显示 / 高级 / 调试分页组织而实际的配置值由 qt/preferences.py 中的Preferences类负责读写。持久化方面dupeGuru 使用 Qt 的QSettings存储键值对读取入口get_value(name, default)qt/preferences.py对序列化回来的字符串做类型还原true/false转布尔、数字串转int写入入口save()在退出时调用_save_values()同步所有偏好运行时核心层通过DupeGuru.get_default(key)/set_default(key, value)与视图层交换配置core/app.py。以下各节均按选项含义 → 实操建议 → 源码印证的顺序展开。2. 扫描类型决定拿什么来比较扫描类型是整个查重流程的起点在 core/scanner.py 中以ScanType枚举集中定义三个版本的扫描器暴露不同的可选集合版本可选扫描类型定义位置标准版 SE文件名Filename、内容Contents、文件夹Folderscore/se/scanner.py音乐版 ME文件名、文件名-字段、文件名-字段无序、标签Tags、内容core/me/scanner.py图片版 PE内容模糊块匹配、EXIF 时间戳core/pe/scanner.py2.1 标准版SE文件名Filename把每个文件名按词拆分后逐词比较结合下文过滤器硬度判断两个文件是否算重复。内容Contents仅当两个文件内容完全相同时才判定为重复。其底层实现在 core/engine.py 的getmatches_by_contents先按文件大小分组仅对大小相同的文件做摘要比较对大文件超过big_file_size_threshold先比较部分摘要再抽样校验零字节文件直接视为匹配。文件夹Folders比较的不是单个文件而是整个文件夹——只有当文件夹内所有文件内容都匹配时两个文件夹才互为重复。扫描器随后会剔除父文件夹也在匹配集合中的冗余匹配core/scanner.py。2.2 音乐版ME音乐版面向音频文件提供更细粒度的文件名解析文件名Filename同标准版按词模糊比较。文件名-字段Filename - Fields先把文件名按 - 分隔符拆成字段如Artist - Title最终匹配百分比取所有字段中最低的匹配百分比。因此Artist - Title与Artist - Other Title的匹配度为 50而普通文件名扫描会给出 75。字段拆分逻辑见 core/engine.py 的getfields比较逻辑见compare_fieldscore/engine.py。文件名-字段无序Filename - Fields (No Order)与上一项相同但字段顺序无关。Artist - Title与Title - Artist匹配度为 100 而非 0。该模式在扫描器里通过no_field_orderTrue标志实现core/scanner.py底层会贪心地为每个字段寻找匹配度最高的对应字段core/engine.py。标签Tags读取每首歌的元数据标签并按字段比较同样取最低字段作为最终匹配百分比。内容Contents要求音频内容完全相同。音频内容Audio Content仅比较音频数据本身忽略元数据。注意俄文版文档中音频内容一项在 core/me/scanner.py 的扫描选项中未单独列出实际以内容统一实现但从用户文档角度它描述了与内容的差异场景此处按文档原文保留。2.3 图片版PE内容Contents对图片做模糊内容比较不仅找精确副本也能发现相似图片缩放、压缩变体等。实现基于感知块匹配见 core/pe/scanner.py 调用的matchblock.getmatches。EXIF Timestamp读取照片的 EXIF 时间戳元数据匹配时间戳相同的照片。速度远快于内容扫描但警告被编辑过的照片往往保留原始 EXIF 时间戳会产生大量误报请谨慎使用。实现见matchexif.getmatchescore/pe/scanner.py。3. 过滤器硬度Filter Hardness匹配阈值的核心旋钮含义两个文件要被判定为重复所需的最低匹配百分比。数值越低返回的重复组越多数值越高过滤越重、结果越少。适用范围仅对分词类扫描文件名、字段、标签和图片模糊块扫描生效内容精确扫描因只产生 100% 匹配不受其影响。默认值扫描器基类的min_match_percentage 80core/scanner.py即默认要求 80% 的词语匹配。图片版文档建议默认 95这是个甜点值——大多数同质量照片即便 PNG 与 JPG 格式不同也能达到 100%但若想用低质量 JPG 匹配 PNG就需要把阈值降到 100 以下。界面形态在 Qt 对话框中是一个范围 1100 的滑块滑块下方标注More Results更多结果方向提示qt/preferences_dialog.py。图片版对话框会在非模糊内容扫描时自动禁用该滑块qt/pe/preferences_dialog.py。匹配百分比的算法原理dupeGuru 的计算公式core/engine.py 的compare函数对两个文件的词语列表去重统计total_count len(first) len(second)即两边词数之和对第一个列表中的每个词若它也出现在第二个列表中则match_count加 1每个匹配词计 1 次但因为是两边都匹配最终分子会 ×2percentage round((match_count * 2 / total_count) * 100)特例即便结果达到 100只要词序不一致就强制降为 99——精确匹配要求顺序一致。以文档中的例子AB CDE FGHI与AB CDE fghij若按普通词计数AB 和 CDE 匹配、共 6 个词匹配度为约 53%见下节词权重示例的对应说明。硬阈值过滤的实现路径min_match_percentage最终进入 core/engine.py 的getmatches先对所有文件建词 → 文件倒排索引build_word_dict通过reduce_common_words剔除出现次数 ≥ 50 的通用词如无意义的常见词避免其干扰仅在m.percentage min_match_percentage时记录匹配对[core/engine.py](https://link.gitcode.com/i/bd460e9c18d2ec945f5da45e5b1b5c66#L267-L268结果按匹配度降序构建Groupcore/engine.py组内ref保留文件由默认排序键-dupe.size决定core/scanner.py。4. 词权重Word Weighting让长词更有分量勾选词权重后匹配百分比不再按词数而是按字符数加权计算每个词的分值等于其包含的字符数。这会让较长、更有辨识度的词对结果影响更大。实现在 core/engine.py 中weight_words标志使total_count变为所有词的字符数之和、match_count每次累加匹配词的字符数。沿用上文示例AB CDE FGHI与AB CDE fghij开启词权重后总字符数 19334 与 335 之和匹配字符数 10AB 4 个 CDE 6 个因 fghij 大小写不同不计匹配度即 53%。默认值扫描器基类word_weighting Falsecore/scanner.py但 Qt 偏好层默认开启self.word_weighting Trueqt/preferences.py。5. 相似词匹配Match Similar Words模糊拼写的代价开启后拼写相似的词也会被计为匹配。例如Белая полоса白条与近似拼写会从 66% 跃升到 100%。警告文档明确提示——此选项极易产生大量误报扫描速度也会显著变慢。它适合那些靠拼写差异藏匿的重复文件但日常使用需谨慎。实现扫描前调用merge_similar_words用difflib.get_close_matches(word, keys, 100, 0.8)相似度 ≥ 0.8合并近形词到同一桶core/engine.py比较时对不在列表中的词尝试近形替换core/engine.py。测试用例 core/tests/engine_test.py 验证了相似词匹配与过远不匹配的行为。默认值match_similar_words False界面默认关闭qt/preferences.py。6. 扫描标签Tags to Scan音乐版专属当扫描类型为标签时可勾选参与比较的标签字段。界面提供六个复选框曲目track、艺术家artist、专辑album、标题title、流派genre、年份yearqt/me/preferences_dialog.py。默认值Qt 偏好层默认勾选 artist、album、titleqt/preferences.py核心扫描器基类的scanned_tags {artist, title}core/scanner.py且 core/scanner.py 定义的SCANNABLE_TAGS恰好就是上面六个字段。扫描时仅对被选中的字段执行getwords并拼接为待比较词语core/scanner.py。7. 图片尺寸与旋转匹配图片版专属匹配不同尺寸的图片Match pictures of different dimensions勾选后不同像素尺寸的图片允许出现在同一重复组中。匹配不同旋转的图片Match pictures of different rotations勾选后不同旋转角度的图片允许在同一重复组中。这两个选项在 Qt 偏好层对应match_scaled与match_rotated默认均为 False最终传入 core/pe/scanner.py 的ScannerPE分别作为matchblock.getmatches的match_scaled/match_rotated参数core/pe/scanner.py。8. 混合文件类型Can Mix File Kind勾选后重复组允许包含不同扩展名的文件例如.jpg与.png不勾选则同一组内扩展名必须一致。实现扫描器在组装匹配对时执行if not self.mix_file_kind: matches [m for m in matches if get_file_ext(m.first.name) get_file_ext(m.second.name)]core/scanner.py。默认mix_file_kind Truecore/scanner.py。9. 忽略指向同一文件的硬链接Ignore Duplicates Hardlinking to the Same File在 OS X 与 Linux 上如果两个重复文件实际是指向同一 inode 的硬链接同一份数据、两个目录项dupeGuru 将不再把它们当作重复。实现扫描开始前若该选项开启start_scanning会调用_remove_hardlink_dupes对收集到的文件按file.path.stat().st_ino去重core/app.py再从self.options[ignore_hardlink_matches]读取开关core/app.py。选项在 Qt 偏好层的键为IgnoreHardlinkMatches。10. 使用正则表达式过滤Use Regular Expressions When Filtering勾选后结果窗口的过滤框输入会被当作正则表达式处理不勾选则按普通文本匹配自动转义特殊字符。实现核心层维护options[escape_filter_regexp]默认 Truecore/app.py。apply_filter在勾选正则时关闭转义否则先escape(result_filter, set(()[]\\.|?^))再把*转成.core/app.py。Qt 偏好键为UseRegexp。正则语法本身超出本指南范围建议参考常规正则教程资源学习。11. 删除或移动后清理空文件夹Remove Empty Folders After Delete or Move开启后一旦某文件被删除或移走且其所在文件夹变为空该文件夹会被自动删除。实现删除与移动操作结束后调用clean_empty_dirs它读取options[clean_empty_dirs]借助delete_if_empty(path, [.DS_Store])沿父级逐层清理core/app.py。注意.DS_Store这类隐藏文件不会阻止清理。Qt 偏好键为RemoveEmptyFolders。12. 复制与移动三种目标路径重建策略该选项决定复制/移动操作动作菜单中如何放置文件。核心层用DestType枚举表示core/app.py默认DestType.RELATIVE直接放入目标Right in destination所有文件直接放进所选目标目录完全不尝试重建源路径。重建相对路径Recreate relative path在目标目录中重建源路径中从目录面板所选根目录往下的部分。示例把/Users/foobar/SomeFolder加入目录面板移动/Users/foobar/SomeFolder/SubFolder/SomeFile.ext到/Users/foobar/MyDestination最终落点为/Users/foobar/MyDestination/SubFolder根SomeFolder被裁剪掉。重建绝对路径Recreate absolute path完整重建源文件的绝对路径。同一示例的最终落点为/Users/foobar/MyDestination/Users/foobar/SomeFolder/SubFolder。名称冲突处理无论哪种策略若目标已存在同名文件dupeGuru 会在目标文件名前追加数字来避免冲突文档原文行为由smart_move/smart_copy保障。实现验证核心逻辑在 core/app.py 的copy_or_move——DestType.RELATIVE时用source_base.relative_to(location_path.relative_to(location_path.anchor))裁剪根目录ABSOLUTE时保留source_path.relative_to(source_path.anchor)的完整相对部分随后调用hscommon.conflict的smart_copy/smart_move移动成功后同样触发空文件夹清理。该操作面向已标记文件批量执行copy_or_move_markedcore/app.py。13. 自定义命令Custom Command调用外部程序该选项指定调用自定义命令动作所执行的命令可用于调用任何外部应用例如你喜爱的差异比较工具。命令格式与命令行写法一致但支持两个占位符%d被选中的重复文件dupe的路径%r该重复文件所属组的参考文件ref路径。引用规则可执行文件路径含空格时必须用双引号包裹占位符也应加引号因为重复文件与参考文件的路径很可能含空格。文档给出的示例C:\Program Files\SuperDiffProg\SuperDiffProg.exe %d %r实现验证核心层 core/app.py 的invoke_custom_command读取偏好CustomCommand对当前每个选中重复项执行cmd.replace(%d, str(dupe.path))与cmd.replace(%r, str(ref.path))。若选中项本身是参考文件%d与%r相同。Windows 下对带空格的可执行路径还有特殊兼容处理先解析路径部分切换到该目录后用shellTrue启动。Qt 偏好键同样为CustomCommandqt/preferences.py。未设置命令时触发该动作会弹出请先在偏好设置中配置的提示。14. 常用偏好键速查综合 qt/preferences.py 的读写逻辑与本文各选项对应的持久化键名汇总如下偏好键对应选项默认值FilterHardness过滤器硬度80SE/ME/ 95PE 建议MixFileKind混合文件类型TrueIgnoreHardlinkMatches忽略硬链接重复FalseUseRegexp正则过滤FalseRemoveEmptyFolders清理空文件夹FalseDestinationType复制/移动路径策略RELATIVECustomCommand自定义命令空WordWeighting界面内词权重TrueMatchSimilarWords界面内相似词匹配False表中默认值取自 core/scanner.py扫描器基类与 qt/preferences.pyQt 偏好层具体以你安装版本的界面实际为准。15. 排查与调校建议结果太少适当调低过滤器硬度或关闭词权重普通文件名含大量短词时按词计数更宽容若怀疑相似拼写漏检再谨慎开启相似词匹配。误报太多调高过滤器硬度图片扫描时避免使用 EXIF 时间戳模式或同时开启匹配不同尺寸/旋转并提高阈值开启忽略硬链接重复可排除同一 inode 的伪重复。移动后目录结构混乱明确区分三种路径策略——只想把文件摊进一个文件夹用直接放入目标希望保留扫描根下的子目录结构用重建相对路径需要完整还原原始路径则选重建绝对路径。自定义命令不生效确认%d、%r都已加引号可执行路径含空格时整体加引号并在动作菜单中先选中至少一个重复文件。如需进一步了解扫描类型与匹配算法的细节可参考英文版 help/en/scan.rst 及 help/en/preferences.rst核心算法与测试用例分别在 core/engine.py、core/scanner.py 与 core/tests/engine_test.py 中可直接对照验证。赞分享桌面应用【免费下载链接】dupeguruFind duplicate files项目地址https://gitcode.com/gh_mirrors/du/dupeguru点击查看免费下载相关推荐dupeGuru 偏好设置完全指南扫描类型、匹配阈值与高级选项详解dupeGuru 偏好设置完全指南扫描类型、匹配阈值与高级选项详解 dupeGuru 是一款跨平台的开源重复文件查找工具支持标准Standard、音乐桌面应用TanStack Ember Table 的 createAtom创建 Glimmer 响应式外部状态 Atom 的完整指南TanStack Ember Table 的 createAtom创建 Glimmer 响应式外部状态 Atom 的完整指南 导读 createAtom 是桌面应用突破性PDF转Word方案pdf2docx如何彻底解决格式保留难题突破性PDF转Word方案pdf2docx如何彻底解决格式保留难题 在数字化办公和文档处理中PDF转Word一直是开发者和技术团队面临的痛点。传统转换工具往文档图像处理上一篇wger API缓存实现使用Memcached缓存健身数据接口下一篇InceptionTime网络架构详解理解Inception模块的强大之处创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表