如何用Python从多目录提取内容唯一的summary.txt文件路径
高效解决软链接导致的重复summary.txt路径去重问题
核心思路:利用操作系统文件标识去重
同一物理文件(包括软链接指向的目标文件)在操作系统中通过**设备号(st_dev)和inode号(st_ino)**唯一标识,不管访问路径如何变化,这两个值始终一致。相比逐文件内容比较,读取文件元数据的速度快几个数量级。
Python实现方案
方案1:基于inode+dev的精准去重
import os def get_unique_summary_files(parent_dir): # 用字典存储唯一文件标识到路径的映射 unique_files = {} for root, _, files in os.walk(parent_dir): for filename in files: if filename == "summary.txt": full_path = os.path.join(root, filename) # 获取文件的设备号和inode,生成唯一标识 stat_data = os.stat(full_path) file_identifier = (stat_data.st_dev, stat_data.st_ino) # 仅保留首次遇到的路径(可根据需求修改为保留最短/最长路径等) if file_identifier not in unique_files: unique_files[file_identifier] = full_path return list(unique_files.values()) # 使用示例 if __name__ == "__main__": parent_directory = "/your/parent_dir/path" unique_paths = get_unique_summary_files(parent_directory) for path in unique_paths: print(path)
方案2:基于真实路径的简化去重
如果不需要处理硬链接场景,也可以用os.path.realpath解析出文件的真实路径,再通过集合去重:
import os def get_unique_summary_files(parent_dir): seen_real_paths = set() unique_paths = [] for root, _, files in os.walk(parent_dir): for filename in files: if filename == "summary.txt": full_path = os.path.join(root, filename) real_path = os.path.realpath(full_path) if real_path not in seen_real_paths: seen_real_paths.add(real_path) unique_paths.append(full_path) return unique_paths
命令行工具方案(利用fdupes)
如果习惯用命令行,可以结合find和fdupes快速处理:
- 收集所有summary.txt路径:
find /your/parent_dir/path -name "summary.txt" > summary_paths.txt
- 用fdupes去重并保留第一个出现的文件:
fdupes -f < summary_paths.txt
-f参数会输出每个重复组的第一个文件,过滤掉后续的重复路径。
为什么这个方案比原方法高效?
- 原方法用
filecmp.cmp需要读取文件内容(至少部分字节)进行比对,大文件或文件数量多时会非常慢; - 本方案仅读取文件的元数据(inode/dev或真实路径),属于轻量级系统调用,性能提升显著;
- 从根本上解决了软链接/路径别名导致的重复识别问题,无需依赖文件大小等不可靠的筛选条件。
内容的提问来源于stack exchange,提问作者yamada
相关产品推荐
相关产品推荐

