はじめに
ファイルの同一性チェックを行うため、ファイル一覧と同時に「ファイルのハッシュ値(MD5ハッシュ)」を取得する方法は以下の通りです。
前回は、出力ファイルをwindowsの差分比較ツール(WinMergeなど)にかけることを想定し、文字コード「S-JIS」、改行コード「CRLF」で出力しました。
今回は、出力ファイルをLinuxの「md5sum」コマンドのinputに使用することを想定し、文字コード「UTF-8」、改行コード「LF」で出力してみたいと思います。
スクリプト
ソースコード
fileListForMd5sum.ps1
# fileListWithMD5.ps1
# 指定のフォルダ配下のファイル一覧を作成する
param($targetDir)
# ISEでの実行用に引数がない場合に初期値を設定する
if($targetDir -eq $null){ $targetDir = '\\file-sever\targetDir' } # 適宜コメントアウト
# 出力するファイル一覧のファイル名
$OutFile = ".\fileListForMd5sum.txt"
$tempOutFile = ".\fileListForMd5sumTemp.txt"
# パラメタチェック
if ($targetDir -eq $null) {
Write-Host "引数が足りません。(引数1:フルパスのフォルダ名)処理を中止します。"
exit 1
}
# フォルダの存在チェック
if (!(Test-Path $targetDir)) {
Write-Host "フォルダが存在しません。処理を中止します。"
exit 1
}
# ファイル一覧作成
# 1.フルパスのファイル一覧を取得
# 2.昇順でソート
# 3.MD5ハッシュを取得し半角スペース区切りで連結
# 4.デフォルトの文字コード(SJIS)でファイル出力
try {
Write-Host ("---ファイル一覧作成中---")
$FileList = dir $targetDir -Recurse -Name -File | Sort-Object
$FileListWithMd5 = @();
# 取得したファイルリストに対し1件つずつMD5ハッシュを取得する
foreach($oneFile in $FileList){
# パス+\+ファイル+半角スペース+MD5ハッシュ
# ファイル毎にMD5ハッシュを取得し、半角スペース区切りで結合する
$dirAndFile = $targetDir + "\" + $fileList[$j]
$LinuxFile = $fileList[$j] -replace "\\" , "/"
$FileListWithMd5 += @((Get-FileHash -Algorithm md5 $dirAndFile).Hash + " " + "/" + $LinuxFile)
}
# 改行コードCRLF、文字コードS-JISでファイルに出力する
Out-File -InputObject $FileListWithMd5 -FilePath $tempOutFile -Encoding default
# 改行コードをLFにする
$LfFile = (Get-Content $tempOutFile -Encoding default) -join "`n"
# 文字コードをBOM無しUTF-8に変換する
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllText($OutFile, $LfFile, $Utf8NoBomEncoding)
# tempファイルを削除する
Remove-Item $tempOutFile
Write-Host ("---ファイル一覧作成完了---")
} catch [Exception] {
$exp = $error[0].ToString()
Write-Host ($exp)
}
処理の流れ
Out-File
で文字コード「S-JIS」、改行コード「CRLF」でファイルに出力するGet-Content
でファイルを行単位に読み込み、-joinで「`n(LF)」で連結するSet-Content
で文字コードを「UTF-8」に設定して再度ファイルに出力する
この時、最後にCRLFが入らないように-NoNewline
とする
出力形式
出力ファイルをLinuxの「md5sum」コマンドのinputに使用するため、出力形式は「MD5ハッシュ値」と「ファイル名」を半角スペース2つで区切って出力します。
出力形式:MD5ハッシュ+△△+ファイル名
(△:半角スペース)
実行方法
Windowsコマンドプロンプトで以下のコマンドを実行します。
powershell -NoProfile -ExecutionPolicy RemoteSigned .\fileListForMd5sum.ps1 \\file-sever\targetDir
ファイル同一性チェックの手順
今回出力したファイル使って、以下のようなことが出来ます。
- ファイルをあるサーバにリリースした時、リリースしようとしているものが正しくリリースできているか確認する(ファイル同一性チェック)
- 手順
- Windows端末で対象資材の「MD5付きファイル一覧」を作成する
- Windows端末からLinuxサーバに「資材」と共に「MD5付きファイル一覧」を転送する
- 資材をLinuxサーバの各ディレクトリにリリースする
- Linuxサーバで以下のコマンドを打ち、「MD5付きファイル一覧」とサーバの実際の資材の同一性チェックをする
md5sum -c <MD5付きファイル一覧>
参考情報
追記
ファイル出力箇所について、当初以下のようにコーディングしましたが
# 改行コードCRLF、文字コードS-JISでファイルに出力する
Out-File -InputObject $FileListWithMd5 -FilePath $tempOutFile -Encoding default
# 改行コードをLFに変換した後、文字コードをUTF-8にして再度ファイルに出力する
(Get-Content $tempOutFile -Encoding defalut) -join "`n" | Set-Content $OutFile -NoNewline -Encoding UTF-8
これだとBOMが付いてしまい、md5sumで1行目が必ず書式エラーとなってしまいます。
そのためBOM無しUTF-8ファイルを出力するように、以下のように変更しました。
# 改行コードCRLF、文字コードS-JISでファイルに出力する
Out-File -InputObject $FileListWithMd5 -FilePath $tempOutFile -Encoding default
# 改行コードをLFにする
$LfFile = (Get-Content $tempOutFile -Encoding default) -join "`n"
# 文字コードをBOM無しUTF-8に変換する
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllText($OutFile, $LfFile, $Utf8NoBomEncoding)
コメント