
桌面应用【免费下载链接】dupeguruFind duplicate files项目地址https://gitcode.com/gh_mirrors/du/dupeguru点击查看免费下载本文是 dupeGuru 结果窗口Results的完整技术指南内容以仓库文档 help/hy/results.rst及其英文版 help/en/results.rst为骨架结合 core/results.py、core/engine.py、core/app.py 等核心源码展开。你将掌握重复组与参考文件的组织规则、标记/选择操作模型、仅显示重复项 Delta 增量值组合筛选法、扫描后过滤含正则模式以及操作菜单中 13 项批量动作与删除选项的底层行为——从而安全、高效地对大量重复文件执行保留、删除、移动与整理。重复组Duplicate Group的构成规则当 dupeGuru 完成重复扫描后结果窗口以重复组duplicate group列表的形式呈现所有结果。一个重复组是互相全部匹配的一组文件其内部结构在 core/engine.py 的Group类中定义参考文件reference file组的第一个文件Group.ref即ordered[0]是打算保留的文件重复文件duplicate files组中其余文件Group.dupes等价于ordered[1:]位于参考文件下方并缩进显示。为什么参考文件永远不能被标记你可以标记任何重复文件但永远无法标记组的参考文件。这是一条安全措施防止 dupeGuru 把重复文件和它的参考一并删除。该约束在源码中体现为 core/results.py 的_is_markable()def _is_markable(self, dupe): if dupe.is_ref: return False ... if dupe is g.ref: return False ...参考文件既带is_ref标志、又位于组的参考位置两重判断保证其标记框始终禁用。谁来决定哪个文件是参考文件判定规则按优先级依次为文件夹状态folder state来自参考文件夹reference folder的文件在重复组中总是作为参考文件。这一状态由 core/directories.py 的DirectoryState枚举管理NORMAL 0、REFERENCE 1、EXCLUDED 2并在收集文件时写入file.is_ref state DirectoryState.REFERENCE。文件大小当组内所有文件都来自普通文件夹时由大小决定。dupeGuru 假定你总是想保留最大的文件因此最大的文件占据参考位置。提示即使没有显式设置参考文件夹扫描引擎在合并匹配对时engine.get_groups()也会按匹配百分比排序、以最大文件为组的参考基准可参见 core/engine.py 的Group.prioritize()逻辑。手动更换参考文件你随时可以手动提升某个重复文件为参考文件选中目标重复文件点击操作 -- 将选中项设为参考Make Selected into Reference。底层由 core/app.py 的make_selected_reference()调用 core/results.py 的make_ref()完成Group.switch_ref()会将该文件移到组的ordered[0]位置并同步更新统计。查看结果细节面板与快速打开虽然你可以用编辑 -- 全选标记再执行操作 -- 将标记项发送到回收站来快速删除所有重复文件但文档始终建议先人工复核再删除。两个辅助手段细节面板Details panel显示当前选中文件的全部元数据并并排显示其参考文件的对应元数据便于快速判断这个重复文件是否真的是重复的。其实现见 core/gui/details_panel.py它从app.selected_dupes[0]取当前文件再取group.ref通过get_display_info()构造左右两列对照表。双击打开双击任一文件会用系统关联的应用打开它app.open_selected()→desktop.open_path()。选择策略如果错误重复false duplicate多于真正的重复例如过滤强度很低正确的做法是逐条复核、只标记真正的重复然后操作 -- 将标记项发送到回收站反之如果真正的重复占多数则应标记所有错误重复用操作 -- 从结果中移除标记项Remove Marked from Results——后者不会触碰磁盘上的真实文件只是把它们从结果列表剔除。标记与选择两种正交状态结果表里每个重复文件有两种独立状态标记marked文件旁的小勾选框被勾选是后续批量操作的动作对象选择selected文件被高亮是界面操作的焦点对象。多选遵循操作系统标准方式Shift / Command / Control 点击。按空格键space可切换所有选中重复文件的标记状态。对应源码为 core/app.py 的toggle_selected_mark_state()若所有选中项状态一致则统一翻转否则统一标记。与全选标记不同从结果中移除选中项Remove Selected from Results会自动忽略所有被选中的参考文件只对重复文件生效——core/app.py 的without_ref()会在移除前过滤掉组内的参考文件。仅显示重复项模式Show Dupes Only启用该模式后结果列表只显示重复文件不显示各自的参考文件列表的选择、标记、排序能力与正常模式完全一致。为什么要用这个模式正常模式下结果按重复组的参考文件排序core/results.py 的sort_groups()以group.ref提取排序键。这意味着如果你想标记所有扩展名为exe的重复文件直接按类型Kind列排序是做不到的——因为一个组可能混有多种类型的文件它们会跟着参考文件被捆绑在一起。文档给出 8 步操作流程启用仅显示重复项模式通过列Columns菜单添加类型Kind列点击类型列表头按类型排序定位到第一个exe类型的重复文件选中它向下滚动列表定位到最后一个exe类型的重复文件按住 Shift 并点击它区间选择按空格键标记全部选中的重复文件。Delta 增量值Delta Values打开Delta 增量值开关后数值型列将不再显示绝对值而是显示相对于该重复文件参考文件的差值并用醒目的橙色显示。例如重复文件 1.2 MB、参考文件 1.4 MB则大小列显示-0.2 MB。在 core/se/result_table.py 中标准模式Standard Edition声明了DELTA_COLUMNS {size, mtime}即大小与修改时间是两个默认的数值增量列排序时的差值计算位于 core/app.py 的_get_dupe_sort_key()if delta: refval cmp_value(get_group().ref, key) if key in self.result_table.DELTA_COLUMNS: result - refval else: same cmp_value(dupe, key) refval result (same, result)也就是说非数值列同样参与增量逻辑当它的值与参考文件不同时以橙色显示相同时保持黑色。sort_dupes(key, asc, delta)中deltaTrue时即触发该路径。组合拳仅显示重复项 Delta 增量值仅显示重复项模式在配合 Delta 增量值时才展现出真正威力——此时你得到的是每个重复文件相对其参考的偏差列表排序即按偏差进行。场景一剔除与参考文件偏差过大的重复文件若想从结果中移除所有与参考文件大小相差超过 300 KB的重复文件在仅显示重复项下按大小列排序选中大小列中所有-300 以下的重复文件并删除对列表底部300 以上的重复文件重复同样操作。场景二按文件名一致性筛选非数值列也会因增量模式而分组对文件名列排序时文件名与参考一致的重复文件黑色值会聚拢在一起。例如你做的是内容扫描但只想删除与参考文件同名的重复文件——直接按文件名排序黑色分组的成员就是目标。场景三改变参考文件的优先级刚完成扫描且没有参考文件夹时每个组的参考文件是最大文件。若想改为以最后修改时间为准在仅显示重复项下按修改时间列降序排序选中所有修改时间 delta 值大于 0 的重复文件点击将选中项设为参考。为什么必须降序core/app.py 的make_selected_reference()对同一组的多个选中文件只提升列表中的第一个changed_groups集合保证每组只处理一次。而你想让最后修改的文件成为参考——降序排列保证列表第一个正是最后修改的那个文件。扫描后过滤FilteringdupeGuru 支持扫描后过滤post-scan filtering收窄结果显示范围以便对子集批量操作。例如轻松标记所有文件名包含copy的重复文件。过滤的匹配对象是每个重复文件的完整路径whole path。只有组内至少有一个重复文件命中过滤条件的组才会显示。底层实现见 core/results.py 的apply_filter()filter_re re.compile(filter_str, re.IGNORECASE) self.__filtered_dupes {dupe for dupe in self.__filtered_dupes if filter_re.search(str(dupe.path))}平台入口差异Windows通过操作 -- 应用过滤器Apply Filter输入过滤串并点应用操作 -- 取消过滤器Cancel Filter恢复全部结果。macOS在工具栏顶部的过滤器Filter搜索框中直接输入清空输入框或点击X恢复未过滤结果。简单模式与正则模式简单模式默认输入的字符串即实际过滤串唯一的通配符是*。例如输入[*]会匹配任何包含[]方括号的内容方括号内是什么无所谓。正则模式勾选过滤时使用正则表达式Use regular expressions when filtering后过滤功能改用正则表达式匹配。注意正则不需要匹配完整文件名只要包含一段匹配的子串即可。两种模式下匹配均不区分大小写re.IGNORECASE。组内部分命中时的行为当一个组中只有部分重复文件命中过滤时整个组仍会显示但未命中的重复文件处于参考模式reference mode即被当作参考对待、不可标记。因此执行全选标记等操作时可以保证只标记到被过滤出来的重复文件。对应实现mark_all()/mark_invert()/mark_none()在存在过滤条件时只作用于self.__filtered_dupes见 core/results.py。实现细节apply_filter()使用filter_re.search()逐层收窄已过滤结果self.__filtered_dupes即在已过滤结果上再次过滤时是叠加式收窄过滤串错误re.error时会被静默忽略而不生效。操作菜单Actions Menu详解文档逐条列出操作菜单的全部命令以下是完整说明底层行为对应 core/app.py 与 core/results.py命令行为底层依据清除忽略列表Clear Ignore List移除你添加过的全部忽略匹配需重新扫描才生效core/ignore.py 的IgnoreList.clear()将结果导出为 XHTMLExport Results to XHTML用当前结果生成 XHTML 文件导出时可见的列即 XHTML 中的列文件会自动在默认浏览器打开core/app.pyexport_to_xhtml()→ core/export.py将标记项发送到回收站Send Marked to Trash将所有标记的重复文件送入回收站操作前会弹出删除选项对话框_do_delete_dupe()使用send2trash移动标记项到...Move Marked to...询问目标文件夹后移动全部标记文件是否重建源路径取决于复制与移动Copy and Move偏好copy_or_move_marked(copyFalse)复制标记项到...Copy Marked to...同上但为复制操作copy_or_move_marked(copyTrue)从结果中移除标记项Remove Marked from Results从结果中移除标记的重复文件磁盘上的真实文件不受影响remove_marked()→perform_on_marked(lambda x: None, True)从结果中移除选中项Remove Selected from Results移除选中的重复文件被选中的参考文件会被自动忽略只删重复remove_selected()→without_ref()将选中项设为参考Make Selected into Reference把选中的重复文件提升为参考若组内有来自参考文件夹蓝色显示的参考则对该文件不动作同组多个选中文件只提升第一个make_selected_reference()→Results.make_ref()将选中项添加到忽略列表Add Selected to Ignore List先把选中重复文件移出结果再把该重复文件 ↔ 当前参考的匹配对写入忽略列表后续扫描不再报告该匹配文件本身可能以另一参考的身份重现可用清除忽略列表清空add_selected_to_ignore_list()→ core/ignore.pyignore()用默认应用打开选中项Open Selected with Default Application用文件类型关联的应用打开open_selected()→desktop.open_path()在文件管理器中显示选中项Reveal Selected in Finder打开包含该文件的文件夹reveal_selected()→desktop.reveal_path()调用自定义命令Invoke Custom Command以当前选中项为参数调用你在偏好设置里配置的外部程序invoke_custom_command()支持%d当前文件与%r其参考文件占位符替换重命名选中项Rename Selected询问新名称后重命名选中的文件多个选中时以第一个为准rename_selected()→d.rename(newname)移动/复制时的路径重建偏好移动/复制标记项是否在目标目录中重建源文件路径取决于偏好设置中的copymove_dest_typeDestType.DIRECT / RELATIVE / ABSOLUTE见 core/app.py。copy_or_move()中相对/绝对模式下会把源路径的父目录结构映射到目标目录下再放入文件名遇到同名目标时由hscommon.conflict.smart_move/smart_copy自动生成不冲突的新名字。删除选项Deletion Options在执行发送到回收站前弹出的删除选项对话框实现见 core/gui/deletion_options.py提供两个开关。文档明确说明大多数情况下你不需要启用其中任何一个。链接已删除文件Link deleted files删除重复文件后用指向参考文件的链接替换它可选择符号链接symlink或硬链接hardlink符号链接指向文件路径的快捷方式原文件被删除或移动后链接即失效硬链接指向文件本身的链接效果与真实文件无异只有当指向该文件的所有硬链接都被删除时文件本身才真正消失。平台差异OS X 与 Linux 完全支持Windows 上则较复杂——Windows XP 不支持Vista 及以上支持但要求 dupeGuru 以管理员权限运行才能生效。源码中的能力检测见DeletionOptions.supports_links()通过探测os.symlink()的NotImplementedErrorXP与OSErrorVista 缺少符号链接权限来区分平台能力。实际执行时linkfunc os.link if use_hardlinks else os.symlink linkfunc(str(ref.path), str_path)对应 core/app.py 的_do_delete_dupe()先send2trash或直接删除再在原路径上创建指向参考文件的链接。use_hardlinks开关只有在link_deleted为真时才有意义因此 UI 会根据前者动态启用/禁用后者set_hardlink_option_enabled()。直接删除文件Directly delete files不经过回收站、直接删除文件主要用于故障排查。当 dupeGuru 在正常删除文件例如网络存储 NAS 上的文件遇到问题时才需要开启。源码路径_do_delete_dupe()中direct_deletion为真时走os.remove()/shutil.rmtree()否则走send2trash()。附结果状态的底层模型理解上述全部操作的钥匙是 core/results.py 的Results类继承自Markable。它管理着groups全部重复组dupes全部重复文件不含参考并缓存排序描述符(key, asc, delta)filtered_dupes / filtered_groups过滤后的子集标记统计mark_count、marked_size在过滤状态下自动只统计过滤子集stat_line状态栏上的 已标记 x / 总数 y大小 汇总供 core/gui/stats_label.py 展示。所有标记、排序、过滤、删除动作都经过这一层再由DupeGuru通过通知机制驱动各 GUI 组件刷新——这就是为什么本文描述的各项交互行为在三个版本Standard / Music / Picture的结果窗口中表现一致只是各版本通过 core/me/result_table.py、core/pe/result_table.py 等扩展出不同的列如音乐版的时长/比特率、图片版的尺寸/EXIF 时间戳。赞分享桌面应用【免费下载链接】dupeguruFind duplicate files项目地址https://gitcode.com/gh_mirrors/du/dupeguru点击查看免费下载相关推荐dupeGuru 结果窗口完全指南重复组、筛选、增量值与批量操作dupeGuru 结果窗口完全指南重复组、筛选、增量值与批量操作 dupeGuru 扫描结束后会在结果窗口中把所有查找到的重复文件组织为重复组列表展示。桌面应用Graylog Web 前端 TableList 组件实战指南数据列表展示、过滤与批量操作Graylog Web 前端 TableList 组件实战指南数据列表展示、过滤与批量操作 本指南围绕 Graylog 开源项目前端 graylog2 we日志分析运维观测SQLite-Vec向量搜索实战K值选择与结果过滤的终极指南SQLite Vec向量搜索实战K值选择与结果过滤的终极指南 SQLite Vec是一个轻量级、高性能的向量搜索SQLite扩展能够在任何SQLite运行的向量数据库数据库上一篇frp 运维实战Dashboard、Prometheus 与动态代理10 分钟搭好完整可观测体系下一篇【亲测免费】 探索时间轴可视化神器TimeVis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考