PowerShell按内容匹配查找仅存在于单个文件夹的独有文件
获取仅DirA存在、DirB不存在的文件列表(内容匹配)
你此前使用jdupes结果不符合预期,是因为默认开启了全范围(含单个目录内部)的重复匹配,DirA内部的重复文件会被判定为非全局唯一,因此被--printunique排除。以下是两种高效实现方案:
方案1:调整jdupes参数实现(性能最优)
jdupes内置文件大小预校验、部分哈希比对等优化,大文件场景下速度远高于手动全量哈希计算,仅需补充--no-internal参数即可解决你遇到的问题:
jdupes --recurse --no-internal --printunique -O DirA DirB
参数说明:
--recurse:递归遍历两个目录下所有子目录--no-internal:关闭单个目录内部的重复比对,仅匹配DirA和DirB之间的文件,完全规避DirA内部重复被误排除的问题--printunique:仅输出不存在匹配项的文件-O:将首个输入目录(DirA)设为最高优先级,最终输出的仅为DirA下符合要求的文件
方案2:通用哈希校验方案(无工具依赖,全平台适配)
如果没有jdupes可用,可以通过哈希计算的方式实现,逻辑更可控:
步骤1:生成DirB所有文件的哈希参考集
会提取DirB下所有文件的SHA256哈希值去重后存储,作为后续比对的基准
- Linux/macOS终端命令:
find DirB -type f -exec sha256sum {} \; | awk '{print $1}' | sort -u > dirb_hash.txt
- Windows PowerShell命令:
Get-ChildItem -Path DirB -Recurse -File | Get-FileHash -Algorithm SHA256 | Select-Object -ExpandProperty Hash | Sort-Object -Unique | Out-File dirb_hash.txt
步骤2:遍历DirA输出符合要求的文件
计算DirA下每个文件的哈希值,和参考集比对后输出不在参考集内的文件路径
- Linux/macOS终端命令:
find DirA -type f -exec sha256sum {} \; | awk 'NR==FNR{hash[$1]=1;next} !($1 in hash){print $2}' dirb_hash.txt -
- Windows PowerShell命令:
$dirbHash = Get-Content dirb_hash.txt | ForEach-Object { $_.Trim() } | Where-Object { $_ } Get-ChildItem -Path DirA -Recurse -File | ForEach-Object { $hash = (Get-FileHash -Path $_.FullName -Algorithm SHA256).Hash if ($hash -notin $dirbHash) { $_.FullName } }
以上两种方案均仅以文件内容作为匹配依据,和文件名、存储路径无关,适配任意子目录嵌套场景。
内容的提问来源于stack exchange,提问作者JohnDoughmaker22
相关产品推荐
相关产品推荐

