拓冰建站拓冰建站
首页 / 资讯中心 / 正文

文件夹文件名对比全攻略:PowerShell、Python与批处理脚本实战

在整理照片、同步项目、迁移备份盘的时候经常碰到同一个需求把两个文件夹里的文件名拉出来对比找出两边同名的那一批文件。这个需求听起来简单真手动操作却很痛苦——文件夹套文件夹数量一多肉眼根本看不过来。这篇文章直接给出一套可落地的方案包含 PowerShell、Python、批处理三种脚本实现外加已有工具的处理思路全部围绕“只对比文件名”这个核心场景展开不求对比内容不碰哈希值目的就是快速定位两边存在同名文件的位置。1. 核心能力速览能力项说明对比维度只对比文件名不对比文件内容、大小、修改时间输入要求两个本地文件夹路径支持网络映射盘子目录处理支持递归扫描子目录也可以只扫顶层输出结果列出两边同名的文件名以及文件所在完整路径实现方式PowerShell 脚本 / Python 脚本 / 批处理 bat批量能力支持一次处理大量文件脚本自动扫描整个目录树导出格式支持控制台输出、CSV 导出、TXT 导出运行平台Windows 优先Python 方案可扩展到 Linux / macOS是否需要安装额外软件PowerShell 方案系统自带Python 方案需安装 Python 运行环境适合场景备份同步前检查、照片去重、项目文件一致性核对、迁移前预检从材料看这是一个纯本地文件处理需求不涉及模型部署、显存占用和 GPU 推理所以本文重点围绕脚本实现、运行验证、批量处理效率、边界场景和错误排查展开。下面直接进入具体方案。2. 适用场景与使用边界“只对比文件名”这个约束条件非常明确。它适用于以下场景迁移文件前想先知道两个目录里哪些文件重名避免覆盖或漏拷。整理多年累积的照片、视频素材目录找出两边可能重复拍摄或重复下载的文件。后端项目重构时对比新旧代码目录里的资源文件定位同名但可能被替换的文件。备份目录与源目录做一致性粗查同名文件存在说明备份关系基本对应。从旧硬盘拷贝数据到新硬盘后抽查复制是否完整同名文件是基础判断条件。但这个方案也有明确的边界必须说清楚同名文件不等于内容相同。文件名相同只是第一层信号如果两个文件内容不同但名字一样脚本依然会判定为重复。内容是否一致需要再配合大小、修改时间、哈希值等手段进一步确认。不同名文件不代表内容不重复。同一张图片复制后改名文件名对比完全看不出来这不是本方案能解决的问题。对比结果只提供“哪些文件名相同”不自动删除任何文件。所有脚本只做分析和输出删除操作必须人工确认。涉及他人版权素材、个人隐私数据、工作机密文件时使用这类脚本只做文件名层面的技术处理删除、复制、分发都必须符合授权约定和相关法规。搞清楚边界之后下面进入具体实现。三种方案各有优势读者可以根据自己的环境选择Windows 上不想装任何东西直接用 PowerShell需要跨平台或者后续想扩展内容对比选 Python就想双击运行、不看代码逻辑用批处理 bat。3. 环境准备与前置条件这里给出一个通用检查清单不绑定具体版本读者按自己电脑实际情况对号入座即可。PowerShell 方案操作系统Windows 7 及以上。Windows 10、Windows 11 自带 Windows PowerShell 5.1无需额外安装。执行策略脚本运行时如果提示“禁止运行脚本”需要先放开当前用户的执行策略。磁盘空间脚本本身几乎不占空间但如果有几万个文件结果导出时建议预留几十 MB 日志空间。路径权限需要确保脚本有权限读取两个目录。如果目标文件夹在系统盘深处或者网络共享位置需要注意访问权限。Python 方案操作系统Windows / Linux / macOS 均可。Python 运行环境建议 Python 3.6 及以上不需要任何第三方依赖库只用标准库 os 和 sys。命令行工具Windows 用户可以在 CMD 或 PowerShell 中运行也可以直接在 VS Code 终端里运行。中文编码Windows 下控制台输出中文文件名容易出现乱码建议了解 chcp 65001 和 PYTHONIOENCODING 的相关设置。批处理方案操作系统Windows 原生命令行环境。对脚本编码敏感。bat 文件如果包含中文注释需要以 ANSI 或 GBK 编码保存否则可能乱码或报语法错误。批处理方案适合简单场景文件名中包含特殊字符时处理起来会比较吃力。4. 方案一PowerShell 脚本实现PowerShell 是 Windows 环境下处理这类问题最顺手的方式不需要安装任何软件脚本也足够直观。下面给出完整脚本。# 对比两个文件夹中的文件名找出两边同名文件 # 使用方式修改 $folder1 和 $folder2 为实际路径然后运行脚本 $folder1 D:\Backup\Source $folder2 D:\Backup\Target $includeSubdir $true $outputCsv D:\Backup\duplicate_names.csv # 递归获取文件对象 $files1 Get-ChildItem -Path $folder1 -Recurse:$includeSubdir -File $files2 Get-ChildItem -Path $folder2 -Recurse:$includeSubdir -File # 以文件名作为 key构建字典同名文件合并完整路径 $map1 {} foreach ($file in $files1) { $fileName $file.Name if ($map1.ContainsKey($fileName)) { $map1[$fileName] $map1[$fileName] | $file.FullName } else { $map1[$fileName] $file.FullName } } $map2 {} foreach ($file in $files2) { $fileName $file.Name if ($map2.ContainsKey($fileName)) { $map2[$fileName] $map2[$fileName] | $file.FullName } else { $map2[$fileName] $file.FullName } } # 取两个 key 集合的交集 $duplicateNames $map1.Keys | Where-Object { $map2.ContainsKey($_) } # 输出到控制台 Write-Host 找到同名文件数量: $($duplicateNames.Count) foreach ($name in $duplicateNames) { Write-Host Write-Host 文件名: $name Write-Host 位于文件夹1: $map1[$name].Split(|) | ForEach-Object { Write-Host $_ } Write-Host 位于文件夹2: $map2[$name].Split(|) | ForEach-Object { Write-Host $_ } } # 导出 CSV 结果 $results foreach ($name in $duplicateNames) { [PSCustomObject]{ 文件名 $name 文件夹1路径 $map1[$name] 文件夹2路径 $map2[$name] } } $results | Export-Csv -Path $outputCsv -NoTypeInformation -Encoding UTF8 Write-Host 结果已导出到: $outputCsv使用方法把上面的代码复制到记事本保存为Compare-FolderNames.ps1。右键脚本文件选择“使用 PowerShell 运行”或者打开 PowerShell 窗口进入脚本所在目录后执行powershell -ExecutionPolicy Bypass -File .\Compare-FolderNames.ps1如果遇到“无法加载文件因为在此系统上禁止运行脚本”的提示执行下面命令放开当前用户执行策略Set-ExecutionPolicy -Scope CurrentUser RemoteSigned脚本运行完成后控制台会输出同名文件清单同时会在指定路径生成 CSV 文件方便后续用 Excel 筛选查看。几个关键点说明Get-ChildItem -File只取文件不会把文件夹目录本身算进去。$includeSubdir $true表示递归子目录如果只对比顶层文件改成$false。同一目录里可能本身就有同名文件比如D:\Backup\Source\a\photo.jpg和D:\Backup\Source\b\photo.jpg脚本会把它们合并成同一条用|分隔多个路径。导出 CSV 时用-Encoding UTF8Excel 打开时可以直接看到中文文件名不会出现乱码。文件名区分大小写的问题。Windows 的文件系统默认不区分大小写Photo.JPG和photo.jpg在 Windows 下会被视为同名。如果需要在 Linux 或者 macOS 上使用PowerShell 脚本需要对 key 做ToLower()处理不过这里不过度扩展Windows 用户直接使用即可。5. 方案二Python 脚本实现Python 方案的优势是跨平台、逻辑清晰而且后续想升级成“文件名 大小 修改时间”多维对比也容易扩展。下面是完整脚本只使用标准库不需要 pip 安装任何第三方包。# -*- coding: utf-8 -*- 对比两个文件夹中的文件名找出两边同名文件 支持递归子目录输出结果到控制台和文本文件 用法python compare_folders.py import os import sys from collections import defaultdict def scan_files(folder): 递归扫描文件夹返回一个字典 key 为文件名value 为完整路径列表 file_map defaultdict(list) for root, dirs, files in os.walk(folder): for name in files: full_path os.path.join(root, name) file_map[name].append(full_path) return file_map def main(): # 在这里修改两个文件夹路径 folder1 rD:\Backup\Source folder2 rD:\Backup\Target # 如果路径不存在直接退出 if not os.path.isdir(folder1) or not os.path.isdir(folder2): print(错误两个文件夹路径必须真实存在) sys.exit(1) print(f正在扫描文件夹1: {folder1}) map1 scan_files(folder1) print(f文件夹1 文件总数: {sum(len(v) for v in map1.values())}) print(f正在扫描文件夹2: {folder2}) map2 scan_files(folder2) print(f文件夹2 文件总数: {sum(len(v) for v in map2.values())}) # 求两个字典 key 的交集即同名文件 duplicate_names set(map1.keys()) set(map2.keys()) print(f找到同名文件: {len(duplicate_names)} 个) output_lines [] for name in sorted(duplicate_names): line f\n line f文件名: {name}\n line f 文件夹1路径:\n for p in map1[name]: line f {p}\n line f 文件夹2路径:\n for p in map2[name]: line f {p}\n line \n output_lines.append(line) print(line) # 导出结果到文本文件 output_txt rD:\Backup\duplicate_names_result.txt with open(output_txt, w, encodingutf-8) as f: f.writelines(output_lines) print(f结果已导出到: {output_txt}) if __name__ __main__: main()运行方法# 在脚本所在目录执行 python compare_folders.py如果运行后控制台中文乱码在 Windows CMD 里先执行chcp 65001或者在执行 Python 时指定编码PYTHONIOENCODINGutf-8 python compare_folders.py这段脚本的行为说明os.walk(folder)会递归遍历所有子目录同时拿到目录树下的所有文件。defaultdict(list)用来把同一个文件名对应的多个完整路径收集起来。比如两个不同子目录里都有report.pdf路径都会被记录。set(map1.keys()) set(map2.keys())是核心交集运算直接把两边文件名相同的 key 筛出来效率远高于两层循环。输出结果同时送到控制台和文本文件。文本文件用 UTF-8 编码保存可以在任何现代编辑器中正常显示。如果后续想升级对比维度只需要在scan_files函数里把(name, size)或(name, size, mtime)作为 key就能实现“文件名 文件大小”一致才算重复这里不再展开。6. 方案三批处理 bat 实现如果不习惯 PowerShell 和 PythonWindows 原生的批处理方案也可以解决问题适合快速查看、不想保存脚本的场景。原理很简单先用DIR /S /B /A-D把两个文件夹的文件绝对路径分别导出到临时列表再用两层FOR循环逐行比对文件名。echo off chcp 65001 nul setlocal enabledelayedexpansion rem 在这里修改两个文件夹路径 set folder1D:\Backup\Source set folder2D:\Backup\Target rem 生成文件列表 dir /S /B /A-D %folder1% %temp%\list1.txt dir /S /B /A-D %folder2% %temp%\list2.txt echo 正在对比请稍候... set count0 for /f delims %%a in (%temp%\list1.txt) do ( for /f delims %%b in (%temp%\list2.txt) do ( if /i %%~nxa%%~nxb ( set /a count1 echo 找到同名文件: %%~nxa echo 文件夹1: %%a echo 文件夹2: %%b echo ---------------------------------------- ) ) ) echo 对比完成共找到 !count! 个同名文件。 endlocal pausebat 方案的优缺点非常直观优点不依赖 Python系统自带直接双击运行适合快速临时判断代码逻辑简单容易看懂。缺点性能差。两层 FOR 循环是 O(n*m) 复杂度文件数量一两千时会明显变慢文件上万后基本不可用。所以批处理方案只适合小规模目录对比正式清理大量文件时不推荐。文件名含特殊字符如、!、^时FOR循环解析可能出错需要转义或借助setlocal disabledelayedexpansion调整。bat 文件建议用 ANSI 或 GBK 编码保存中文内容用 UTF-8 保存容易出现字符解析异常。实际项目中批处理更多是应急用大批量场景建议优先选择 PowerShell 或 Python。7. 已有工具方案如果不想写脚本也有现成的桌面工具可以做文件夹文件名对比。常见的重复文件查找工具如 DupeGuru、Duplicate Cleaner 等虽然主打“内容哈希查重”但一般也提供“文件名相同”这一类过滤条件。使用方式通常是下载并安装工具。把两个文件夹拖入扫描范围。选择“文件名相同”作为匹配条件关闭“内容相同”条件。执行扫描等待结果。这类工具的好处是有图形界面操作直观适合完全不想碰代码的用户。但也要注意几个问题部分工具支持“文件名相同 文件大小相同”组合对比这会比纯文件名对比更接近真实重复但也可能漏掉文件名相同但大小不同的情况。工具可能会内置“移动/删除重复项”功能使用删除操作前务必确认结果列表避免误删。版权和软件授权问题。下载工具尽量选择开源或官方渠道不要使用来路不明的破解版。大批量目录扫描时工具的索引过程同样要耗费时间和内存提前估算好规模。如果文件夹数量很大、希望结果可以自动化处理和留痕还是建议用脚本方案输出结果更容易集成到自己的备份或同步流程中。8. 资源占用与性能观察这个需求不涉及 GPU、显存但文件扫描和对比同样有性能问题需要观察。这里给出通用参考思路具体耗时以实际目录规模为准。影响性能的关键因素文件总数。文件数量直接决定扫描时间和内存占用。PowerShell 和 Python 都是先构建完整文件列表再求交集内存开销随文件数量线性增长。目录层级深度。深层嵌套目录对Get-ChildItem -Recurse和os.walk的影响主要体现在 IO 次数上层次越深、越分散扫描越慢。是否走网络路径。对比网络共享文件夹时延迟会明显拉高扫描耗时。同一批文件放在本地磁盘和放在 NAS 上扫描时间可能相差数倍。输出方式。控制台逐行打印比写入文件慢得多文件数量很大时建议关闭控制台输出直接把结果写入 CSV 或 TXT。降低资源消耗的方法先在小范围目录上试跑一次确认结果格式符合预期再扩大到完整目录。如果只需要找同名文件不需要立即知道全部路径可以先只在控制台输出文件名路径后续筛选再补。避免把结果文件放在被扫描的文件夹里。比如脚本把 CSV 输出到D:\Backup\Source下的某个文件下次扫描时该 CSV 也会被当成普通文件收集进名单导致结果里混入自己。文件数量过十万时建议改用 Python 方案并配合set运算不要用 bat 的两层循环。控制台中文输出乱码时不要急着改脚本逻辑先检查代码页设置是否已切换到 UTF-8。批量任务稳定运行的标志是扫描过程中没有报权限错误、没有出现空路径、结果数量稳定、重复运行两次数据一致。从实际使用角度看PowerShell 和 Python 脚本处理三五万文件通常只是几秒到几十秒的差异瓶颈主要在磁盘 IO。如果两个文件夹在同一块机械硬盘上同时频繁读取会导致寻道时间上升有明显卡顿感。这时候可以把两个文件夹分别放在不同磁盘上扫描或者耐心等待一轮扫描完成后再进行下一轮。9. 常见问题与排查方法问题现象可能原因排查方式解决方案PowerShell 提示禁止运行脚本系统执行策略默认 Restricted查看策略状态Get-ExecutionPolicy执行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned后重试脚本能找到目录但结果为空两个文件夹里确实没有同名文件检查两个文件夹路径是否正确、权限是否可读先手动 DIR 抽查两边文件名确认对比逻辑无误中文文件名输出乱码PowerShell 控制台编码或 CSV 编码问题检查代码页和文件编码调整chcp 65001Excel 打开 CSV 前导入 UTF-8 编码Python 脚本运行时提示路径不存在直接复制的路径带引号或包含特殊字符检查 raw string 写法rD:\...删除多余引号、空格使用绝对路径同名文件太多结果刷屏对比的两个文件夹高度重合重定向输出到文件修改脚本把Write-Host改为写入 TXT/CSVbat 脚本双击后窗口一闪而过脚本语法错误或路径不存在在 CMD 中直接运行 bat 查看报错在脚本最后加pause查看错误信息检查中文编码扫描速度慢到无法接受文件数量大、目录层级深、网络路径先小目录测试定位瓶颈换 Python 方案关闭控制台输出结果只写文件同一文件在两边目录中重复出现多条一个目录里本身就有多个子目录包含同名文件检查脚本输出路径列表这是正常现象脚本会把所有路径都列出来结果文件被下次扫描当成输入文件输出文件放在了被扫描目录内检查输出路径所在位置把输出目录放在扫描范围之外或设置排除规则Linux / macOS 下脚本无法运行路径分隔符或编码差异确认系统类型Windows 路径写法改用/脚本本身用 Python 跨平台版本其中最容易踩的坑有两个。第一PowerShell 脚本完成后如果输出 CSV要确认 CSV 文件没有生成在两个对比文件夹之一里面否则下次扫描时结果文件会混进文件列表。第二Python 脚本在 Windows 上处理大量文件时如果路径过长超过系统默认限制可能跳过部分文件表现为结果不完整。此时需要确认目录是否启用了长路径支持或者把素材先移动到更浅的目录层级再对比。10. 最佳实践与使用建议10.1 先小范围试跑再全量执行不管用哪种方案第一次运行都先挑一个包含少量文件的子目录测试确认输出格式符合预期。盲目对几十 GB 的目录全量跑万一脚本路径写错或输出参数有问题浪费时间。10.2 结果文件与扫描目录隔离脚本生成的 CSV、TXT 结果文件一律放到扫描范围之外的目录比如D:\Backup\compare_output\。否则下次扫描时上一次的结果文件也会被纳入文件列表影响结果准确性。10.3 区分“仅查看”与“删除重复”两个阶段文件名相同的文件内容不一定相同。最佳实践是全量导出同名文件清单后先用 Excel 或文本编辑器分类查看再针对重点文件做二次确认最后才考虑是否删除或覆盖。删除操作必须人工介入脚本只提供位置线索。10.4 重要数据先备份如果目标目录是重要数据目录执行任何删除、移动前务必备份。可以通过 3-2-1 原则管理备份即至少 3 份副本、2 种不同介质、1 份异地或离线副本。文件名对比脚本本身不会修改数据但后续人工处理时存在误操作风险。10.5 批量任务留痕如果是在生产环境或工作目录中做整理建议每次对比都保留一份结果文件。文件名加日期后缀如duplicate_names_20250101.csv方便后续追溯。10.6 隐私、版权与合规边界处理他人电脑、公司服务器、公共共享文件夹时注意数据隐私和授权问题。文件名对比本身是中性技术操作但批量移动或删除文件前必须确认数据来源合法、使用者具备相应权限。涉及版权素材、个人隐私、工作机密时所有操作应限于授权范围。使用第三方工具时也从官方或可信渠道下载避免引入恶意软件。10.7 扩展方向如果文件名对比已满足需求后续可以按需扩展文件名 文件大小 修改时间组合对比准确率更高。增加排除目录规则比如跳过.git、node_modules、Thumbs.db等无需关注的目录。输出为 HTML 报告带超链接直达文件位置。集成到定时任务中定期检查两个同步目录的文件名一致性问题。11. 总结与下一步这次整理的三种脚本方案已经把“对比两个文件夹中的文件找出重复的只对比文件名”这个需求完整覆盖了。没有复杂依赖、不需要额外安装重型软件PowerShell 和 Python 两种方案都能在 Windows 环境下直接使用Python 方案还支持跨平台。优先推荐 PowerShell 方案。系统自带、代码直接复制就能跑、输出 CSV 方便查看对多数人来说是最省事的路径。如果熟悉 Python 或者需要更细粒度地控制扫描逻辑Python 方案的可扩展性更好。bat 方案只建议在小目录、应急场景下偶尔用一次不适合大规模文件对比。最容易踩的坑集中在三点结果文件放在扫描目录里导致自污染、中文编码没设置好导致输出乱码、把“同名”当成“内容重复”直接删除。所有脚本都只做分析和输出数据安全的关键一步留给人工判断这一点务必记住。下一步建议直接创建一个测试目录放几个同名文件把 PowerShell 脚本跑通确认输出结果符合预期。跑通之后再对真实目录操作效率会高很多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门