ARTICLE DETAIL

资讯详情

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

dupeGuru 重复文件重新优先级排序(Re-Prioritization)完整指南:用可组合标准精确控制每组参考文件

dupeGuru 重复文件重新优先级排序(Re-Prioritization)完整指南:用可组合标准精确控制每组参考文件 桌面应用【免费下载链接】dupeguruFind duplicate files项目地址https://gitcode.com/gh_mirrors/du/dupeguru点击查看免费下载本指南系统讲解 dupeGuru 的重新确定重复文件优先级Re-Prioritization功能它解决的核心问题是扫描结果中每组哪个文件应被选为参考文件的自动化判定偏差。读完本文你将掌握该对话框的调用方式、五大乃至模式专属的标准类别的含义、多标准组合与平局裁决规则以及其底层sort_key排序机制在 core/prioritize.py 与 core/gui/prioritize_dialog.py 中的完整实现原理。为什么需要重新排序参考文件dupeGuru 在完成重复扫描后会把每个重复组dupe group内的文件自动排出一个顺序其中排在最前、占据参考位置reference position的文件就是该组后续操作如删除、重命名、移动到回收站时的默认基准对象。通常情况下这个自动判定是对的但有时它也会选错。此时你有两条补救路线轻量路线配合结果列表的 Delta Values差异值和 Dupes Only仅显示重复项排序选项再叠加 Make Selected into Reference将选中项设为参考动作可以手工把某个文件提升为参考文件重量路线当组很多、手工逐个修正成本过高或者需要一套可复用的统一规则时就轮到Re-Prioritization 对话框登场——它让你一次性为所有重复组批量重算参考文件。需要强调的是重新排序不会删除或移动任何文件它只改变每个组内部文件的先后次序与参考文件归属属于纯视图层面的数据重组。打开方式Actions 菜单 → Re-Prioritize Results在 dupeGuru 主界面中通过顶部菜单栏的Actions操作→ Re-Prioritize Results重新排序重复结果即可呼出该对话框。菜单入口在 GUI 层的对应动作由PrioritizeDialog承载其构造逻辑见 core/gui/prioritize_dialog.pyclass PrioritizeDialog(GUIObject): def __init__(self, app): GUIObject.__init__(self) self.app app self.categories [cat(app.results) for cat in app._prioritization_categories()] self.category_list CriterionCategoryList(self) self.criteria [] self.criteria_list GUISelectableList() self.prioritizations [] self.prioritization_list PrioritizationList(self)注意app._prioritization_categories()是按当前运行模式动态决定可用类别的见 core/app.py运行模式来源模块可用类别标准文件模式Standardcore/prioritize.pyKind、Folder、Filename、Size、Modification图片模式Picturecore/pe/prioritize.py上述五类 Dimensions尺寸音乐模式Musiccore/me/prioritize.py上述五类 Duration时长、Bitrate码率、Samplerate采样率也就是说你在图片模式下会看到尺寸优先在音乐模式下会看到时长/码率优先这正是模式化架构core/se、core/pe、core/me在优先级标准上的直接体现。界面布局左侧可用标准右侧已选标准对话框采用典型的双列表 组合框布局左侧列表当前选中类别下的全部可用子参数subargument。例如选中 Size 类别后左侧列出 Highest最大和 Lowest最小右侧列表你已经挑选、参与排序的标准链prioritization list自上而下的顺序即优先级顺序顶部组合框用于在各类别Kind / Folder / Filename / Size / Modification / 模式专属类别之间切换箭头按钮向右箭头把左侧选中的子参数添加到右侧向左箭头把右侧选中的标准移除。界面状态由PrioritizeDialog的select_category()/add_selected()/remove_selected()三个公开方法维护core/gui/prioritize_dialog.py而左侧类别列表与右侧标准列表分别对应CriterionCategoryList与PrioritizationList两个可选中列表控件。标准Criterion的本质类别 参数一个标准由类别category 参数argument两部分构成在界面和测试中统一显示为类别 (参数)的格式例如Size (Highest)——文件体积最大者胜出Folder (/foo/bar)——位于/foo/bar文件夹下的文件胜出Filename (Doesnt end with number)——文件名不以数字结尾者胜出。这种类别参数结构在源码中由Criterion类建模core/prioritize.pyclass Criterion: def __init__(self, category, value): self.category category self.value value self.display_value category.format_criterion_value(value) def sort_key(self, dupe): return self.category.sort_key(dupe, self.value) property def display(self): return f{self.category.NAME} ({self.display_value})其中display属性就是你在右侧列表里看到的文字format_criterion_value负责把内部数值参数翻译成人类可读的文案。基础模式五大类别详解以下类别定义于 core/prioritize.py参数值、含义与实现方式如下类别参数显示名判定逻辑源码实现Kind类型重复组中实际出现过的扩展名无扩展名时显示 None匹配该扩展名的文件胜出子参数列表由当前结果中所有重复文件动态提取并去重排序KindCategory见 core/prioritize.pyFolder文件夹重复组中实际出现过的文件夹路径在该文件夹或其任何子文件夹中的文件胜出FolderCategory见 core/prioritize.pyFilename文件名Ends with number以数字结尾、Doesnt end with number不以数字结尾、Longest最长、Shortest最短、Longest Path路径最长、Shortest Path路径最短按文件名去掉扩展名长度或结尾数字特征判定Longest/Longest Path 取反实现大者在上FilenameCategory见 core/prioritize.pySize大小Highest最大、Lowest最小文件字节数最大/最小者胜出SizeCategory见 core/prioritize.pyModification修改时间Newest最新、Oldest最旧修改时间最新/最旧者胜出MtimeCategory见 core/prioritize.py几个容易忽略但重要的细节Kind 与 Folder 是动态参数类别它们的子参数不是写死的而是从当前扫描结果中提取真实存在的值。测试 core/tests/prioritize_test.py 验证了选中 Kind 后左侧列表显示的是组内实际出现的[ext1, ext2]若文件都没有扩展名则显示[None]同文件 L186-L190。Folder 标准的子文件夹语义FolderCategory.sort_key使用value.relative_to(crit_value)判断目标路径是否位于选定目录或其子目录之下core/prioritize.py。因此选择Folder (foo)时foo/bar下的文件同样被视作命中——测试test_folder_crit_includes_subfolders专门验证了这一点core/tests/prioritize_test.py。Filename 的六个参数中以数字结尾类参数只考察文件名去掉扩展名后的末位字符value.strip()[-1:].isdigit()而 Longest/Shortest 比较的是去扩展名后的名称长度core/prioritize.py。图片与音乐模式的专属类别图片模式新增Dimensions (尺寸)参数为 Highest/Lowest按像素尺寸(width, height)比较且取反时是(-width, -height)二元组整体取反core/pe/prioritize.py音乐模式新增Duration时长、Bitrate码率、Samplerate采样率三个数值类别core/me/prioritize.py它们都继承NumericalCategory因此只提供 Highest/Lowest 两种参数。添加与编排标准的操作步骤在对话框中完成一次标准配置需要以下三步对应官方文档描述与 core/gui/prioritize_dialog.py 的实现在组合框中选择一个类别如 Size此时左侧列表刷新为该类别的全部子参数在下方子参数列表中选中一个参数如 Highest点击向右箭头按钮该标准即以Size (Highest)的形态追加到右侧列表。右侧列表支持拖拽排序drag drop直接调整标准的先后次序对应PrioritizationList.move_indexes()core/gui/prioritize_dialog.py移除选中后点击向左箭头对应remove_selected()重复添加同一类别可以添加多个不同参数右侧允许出现两条同类标准如Kind (ext1)与Kind (ext2)并存。配置完成后点击确认对话框调用perform_reprioritization()把_sort_key交给self.app.reprioritize_groups(...)执行core/gui/prioritize_dialog.py。排序规则按标准链依次裁决平局向下传递右侧列表的顺序至关重要它决定平局时如何继续裁决选择每组参考文件时先应用第一条标准若出现平局多个文件在该标准下等值则用第二条标准再裁决依此类推若所有标准都无法分出胜负则沿用该组内原有的文件顺序。官方文档给出的经典示例是标准依次为Size (Highest)与Filename (Doesnt end with number)。那么每组中先选体积最大的文件作为参考若存在两个或多个同体积文件则在它们之间优选文件名不以数字结尾的那个若仍打平则保留组内原有次序。这个逐级裁决逻辑对应PrioritizeDialog._sort_key返回的多元组core/gui/prioritize_dialog.pydef _sort_key(self, dupe): return tuple(crit.sort_key(dupe) for crit in self.prioritizations)Python 元组比较天然按元素逐个比对恰好实现了第一条标准 → 平局再比第二条 → …的链式语义。元组元素同为 0 时即平局最终落到组内原始顺序。底层Group.prioritize 的排序实现真正执行重排的是Group.prioritize()core/engine.pydef prioritize(self, key_func, tie_breakerNone): new_order sorted(self.ordered, keylambda x: (-x.is_ref, key_func(x))) changed new_order ! self.ordered self.ordered new_order if tie_breaker is None: return changed # ... 平局时用 tie_breaker 进一步挑选参考文件排序键是(-x.is_ref, key_func(x))现有参考文件is_ref为真仍会被排在最前其余文件再按你配置的标准链的key_func排序。prioritize()返回是否发生变化的布尔值。reprioritize_groups()随后遍历所有组core/app.pydef reprioritize_groups(self, sort_key): count 0 for group in self.results.groups: if group.prioritize(key_funcsort_key): count 1 if count: self.results.refresh_required True self._results_changed() msg tr({} duplicate groups were changed by the re-prioritization.).format(count) self.view.show_message(msg)统计实际发生了变化的组数并弹出提示框告诉你有多少个重复组因重新排序而改变若没有任何组发生变化则不会弹出提示。数值类标准的取反技巧NumericalCategory.sort_key体现了最高优先的实现窍门core/prioritize.pydef sort_key(self, dupe, crit_value): value self.extract_value(dupe) if crit_value self.HIGHEST: # we want highest values on top value self.invert_numerical_value(value) return valuePython 的sorted默认升序因此想要最大值排最前就把值取负。Size、Modification、Dimensions、Duration、Bitrate、Samplerate 全部复用这套机制而ValueListCategoryKind、Folder 这类命中即胜的标准则约定命中返回 0排最前未命中返回 1排后core/prioritize.py。测试验证行为即规范仓库内置的 core/tests/prioritize_test.py 系统性地验证了上述全部行为是最佳的可执行文档test_size_reprioritizationL106-L111对一组size1/size2的文件应用Size (Highest)后参考文件变为size2的那个test_filename_reprioritizationL152-L156Filename (Ends with number)会让foo1.ext胜出foo.exttest_kind_reprioritizationL53-L61与test_folder_reprioritizationL70-L76Kind、Folder 标准同样生效test_prilist_displayL79-L96右侧列表按[Kind (ext2), Folder (folder2), Size (Lowest)]的顺序正确展示多标准test_reorder_prioritizationsL114-L123拖拽移动标准位置后列表顺序随之更新test_remove_crit_from_listL126-L135移除标准后列表同步缩短test_add_crit_without_selectionL138-L142未选中任何子参数就点添加箭头不会崩溃add_selected()内部有selected_index is None的保护见 core/gui/prioritize_dialog.pytest_longest_filename_prioritizationL201-L205Filename (Longest)让更长的文件名胜出test_folder_crit_includes_subfoldersL175-L183Folder (foo)同时覆盖foo/bar子目录下的文件。这些用例覆盖了标准添加、移除、排序、平局、子文件夹语义与空扩展名兜底可作为你配置参考标准时的行为基准。与其他排序/选择手段的配合重新排序参考文件并不是孤立的操作官方文档建议的完整工作流是先用结果列表的Delta Values按差异值排序和Dupes Only只显示有重复的文件快速聚焦可疑分组对少数组使用Make Selected into Reference手工把正确文件设为参考当组数过多、规则统一时再进入Re-Prioritize Results对话框批量重排。三种手段可以叠加使用Group.prioritize排序时会优先保留当前is_ref的文件而重新排序完成后你依然可以手工调整单个组的参考文件。这保证了自动批量规则与人工微调互不冲突——先批量排序再逐个精修是处理大型重复集最高效的组合拳。小结Re-Prioritization 是 dupeGuru 处理自动选择参考文件不准问题的最终武器它以类别 参数的可组合标准为输入以标准链依次裁决、全平局回退组内原顺序为规则对全部重复组批量重算参考文件。理解Criterion.sort_key的元组链式比较、ValueListCategory的命中即胜约定、NumericalCategory的取反技巧以及Group.prioritize对is_ref的保留逻辑你就能准确预判任何标准组合的排序结果让每一组的赢家都符合你的预期。赞分享桌面应用【免费下载链接】dupeguruFind duplicate files项目地址https://gitcode.com/gh_mirrors/du/dupeguru点击查看免费下载相关推荐开源贡献者与维护者如何获得资金支持深入解读 opensource.guide《为开源工作获取报酬》指南开源贡献者与维护者如何获得资金支持深入解读 opensource.guide《为开源工作获取报酬》指南 本篇技术指南以 GitHub 开源指南Open So桌面应用dupeGuru Re-Prioritize 重排序指南用规则把正确的重复文件送到参考位dupeGuru Re Prioritize 重排序指南用规则把正确的重复文件送到参考位 导读 当 dupeGuru 扫描出重复文件后它会为每个重复组自动挑桌面应用osquery 文档体系全解析RTD Wiki、mkdocs 与 Doxygen 构建指南osquery 文档体系全解析RTD Wiki、mkdocs 与 Doxygen 构建指南 osquery 项目将用户指南、开发者手册与 API 文档分层组织桌面应用上一篇Onlook 服务端图片压缩指南基于 Sharp 的 onlook/image-server 实践与源码解析下一篇React Color 完整使用指南13 种颜色选择器组件与自定义选择器实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表