つ dirdiff.cmd
@set "arg1=%~1" & set "arg2=%~2"
@powershell "iex((@('','','')+(cat '%~f0' | select -skip 3))-join[char]10)"
@exit /b %ERRORLEVEL%
$md5 = New-Object System.Security.Cryptography.MD5CryptoServiceProvider
function Get-MD5s($dir){
$md5s = @{}
Get-ChildItem $dir |
Where-Object { $_.Mode[0] -ne "d" } |
ForEach-Object {
$data = [System.IO.File]::ReadAllBytes($_.FullName)
$bs = $md5.ComputeHash($data)
$md5s[ $_.Name ] = `
([System.BitConverter]::ToString($bs).ToLower() -replace "-","")
}
return $md5s
}
$dir1 = $env:arg1
$dir2 = $env:arg2
$hash1 = (Get-MD5s $dir1)
$hash2 = (Get-MD5s $dir2)
foreach($p in $hash1.Keys){
if( $hash2.ContainsKey($p) ){
$private:val1 = $hash1[$p]
$private:val2 = $hash2[$p]
if( $val1 -ne $val2 ){
Write-Output ("{0} differ" -f $p)
Write-Output (" {0} {1}" -f $val1,(Join-Path $dir1 $p))
Write-Output (" {0} {1}" -f $val2,(Join-Path $dir2 $p))
}else{
Write-Verbose ("{0} same" -f $p)
}
}else{
Write-Output ("{0} not found" -f (Join-Path $dir2 $p))
}
}
foreach($p in $hash2.Keys){
if( -not $hash1.ContainsKey($p) ){
Write-Output ("{0} not found" -f (Join-Path $dir1 $p))
}
}
# vim:set ft=ps1:
- 最初の3行は、PowerShell をバッチファイル化するためのまじない
- 二つのディレクトリの直下にあるファイルの md5 を連想配列に格納して、比較するだけ
こういうのは別のバッチファイルから呼び出したいから、Goで作った方がいいな…と後から思いました。まる
追記
Goで作ってみました。https://github.com/zetamatta/experimental/blob/master/dirdiff/main.go