
給定 2 個目錄(DirA 和 DirB),找出 DirA 中存在但 DirB 中不存在的檔案清單的最有效方法是什麼?
我嘗試使用該jdupes.exe --printunique --recurse -O
工具執行此操作,但是,如果 DirA 上存在所述文件的重複項,則這會產生排除符合上述條件的文件的副作用。
這些檔案可能位於 DirA 和 DirB 完全不同的子目錄中,它們可能具有不同的名稱。因此文件的內容是唯一持久的特徵。
答案1
傳回的字串來自電源外殼的獲取文件哈希可用作鑰匙哈希表將內容與完全限定路徑相關聯。此程式碼為每個路徑建立一個哈希表,但有以下注意事項。
- 空文件將被忽略,因為所有空文件的內容雜湊都是相同的。 (您也可以在每個目錄中建立一個空檔案清單)
- 如果發現重複項之內我們正在索引的目錄,只有找到的第一個檔案才會加入到
$HashOut
表中。該$Dups
表將包含共享相同內容的所有路徑的清單。
電源外殼:
Function Get-DirHash ( [String]$PathIn , [PSObject]$HashOut )
{
$HashOut.Clear()
gci $PathIn *.txt -Recurse | ? Length -gt 0 | Get-FileHash | %{
If ( $HashOut.Contains($_.Hash) )
{
If ( $Dups.Contains($_.Hash) )
{
$Dups[$_.Hash] += $_.Path
}
Else
{
$Dups.Add( $_.Hash , @( $HashOut[$_.Hash] , $_.Path ))
}
}
Else
{
$HashOut.Add( $_.Hash , $_.Path )
}
}
}
$DirA = 'c:\whatever'
$DirB = 'c:\whenever'
$TableA = @{}
$TableB = @{}
$Dups = @{}
$Unique2A = New-Object System.Collections.Generic.List[String]
Get-DirHash -PathIn $DirA -HashOut $TableA
Get-DirHash -PathIn $DirB -HashOut $TableB
$TableA.Keys | %{
If ( ! ( $TableB.Contains($_) ))
{
$Unique2A.Add( $TableA[$_] )
}
}
$Unique2A | Out-GridView
尚未經過充分測試,但我相信這可以實現僅計算大小匹配的文件的哈希值的技巧。
$DirA = 'c:\whatever'
$DirB = 'c:\whenever'
$TestA = [Regex]::Escape($DirA)
$MasterList = gci $DirA , $DirB -Filter *.txt -recurse | Group Length
$Unique2A_BySize = ( $MasterList | ? Count -eq 1 |
? { $_.Group[0].DirectoryName -match $TestA } ).Group.FullName
$Unique2A_ByHash = ( $MasterLIst | ? Count -gt 1 | %{
$_.Group | Get-FileHash | Group Hash |
? Count -eq 1 |
? { $_.Group[0].Path -match $TestA }
} ).Group.Path
( $Unique2A = $Unique2A_BySize + $Unique2A_ByHash ) | Out-GridView
這可能會因難以閱讀而得到改善:
$DirA = 'c:\whatever'
$DirB = 'c:\whenever'
$TestA = [Regex]::Escape($DirA)
$Unique2A = ( ( $MasterList = gci $DirA , $DirB -Filter *.txt -recurse | Group Length ) |
? Count -eq 1 |
? { $_.Group[0].DirectoryName -match $TestA } ).Group.FullName +
( $MasterLIst | ? Count -gt 1 | %{
$_.Group | Get-FileHash | Group Hash |
? Count -eq 1 |
? { $_.Group[0].Path -match $TestA }
} ).Group.Path
$Unique2A | Out-GridView
答案2
我將目錄列表複製到 Excel 並使用 UNIQUE 函數