仕事でたくさんのPDFファイルを扱うのですがコピーも多いので、NASに同じファイルがあるかを調べるスクリプトを作りました。
NASのファイル一覧をCSVファイルに出力する
NASへのファイルアクセスを減らしたいので、一旦NASの中のファイル情報(フルパス、ファイルサイズ、最終書き込み日時)をCSVファイルに出力します。下のスクリプトをNASの検索対象のフォルダで実行してfilelist.csv
を作成します。
NASのデータを集める
Get-ChildItem *.pdf -Attributes Archive -Recurse | Select-Object Name,FullName,Length,LastWriteTime | Export-Csv filelist.csv -Encoding UTF8
ファイルを検索する
先のスクリプトで出力されたfilelist.csv
を検索したいファイルがあるフォルダに移動して下のスクリプトを実行します。
ファイルを検索する
$m = Import-Csv filelist.csv -Encoding UTF8
Get-ChildItem *.pdf -Attributes Archive -Recurse | ForEach-Object {
$h = (Get-FileHash $_.FullName -Algorithm SHA256).Hash
$s = 'None'
foreach($t in $m){
if (($_.Length -eq $t.Length) -And ([DateTime]::$_.LastWriteTime -eq [DateTime]::$t.LastWriteTime)){
if ($h -eq (Get-FileHash $t.FullName -Algorithm SHA256).Hash){
$s = $t.FullName
break
}}}
Write-Host $_.FullName,$s
}
プログラムは、「ファイルサイズ」が同じで、「最終書き込み日時」が同じで、「SHA256のハッシュ値」が同じであるかを調べています。(コピーするとファイル名が変更される場合があるので、ファイル名が同じであるかは調べていません。)