複数の PDF ファイルを扱う際、同名のファイルが異なるフォルダに存在すると名前の衝突が発生することがあります。また、内容が同じファイルには同じ名前を付けたいという場面もあります。
本記事では、PowerShell を使用して、PDF の中身に基づいてファイル名に短いハッシュを付けることで、簡潔かつ一意なファイル名にリネームする方法を紹介します。
スクリプト
以下のワンライナーで、現在のディレクトリ内にあるすべての PDF ファイルを、内容ベースでハッシュ付きの名前に変更できます。
Get-ChildItem -Filter *.pdf | ForEach-Object { $hash = (Get-FileHash $_.FullName -Algorithm SHA1).Hash.Substring(0, 7).ToLower(); Rename-Item $_.FullName -NewName "$($_.BaseName)_$hash.pdf" }
使用例
たとえば、invoice.pdf
というファイルが存在すると、内容に応じて次のようにリネームされます。
invoice_7c9e667.pdf
同じ内容のファイルは常に同じハッシュになるため、名前も一致します。これにより、内容が同一かどうかをファイル名で判断できるようになります。
スクリプトの構成
-
Get-ChildItem -Filter *.pdf
現在のフォルダ内の PDF ファイルを取得します。 -
Get-FileHash -Algorithm SHA1
ファイルの中身に基づく SHA-1 ハッシュ値を取得します。 -
Substring(0, 7)
ハッシュ値の先頭7文字だけを使用します。Git などでも一般的な長さです。 -
Rename-Item
元のファイルをハッシュ付きの名前に変更します。
カスタマイズ方法
ハッシュの文字数を変更したい場合
以下のように数値を変更します。
...Hash.Substring(0, 12)
より長くすれば一意性は高まります。
タイムスタンプを使いたい場合
ハッシュではなく日時を用いたい場合は、以下のように書き換えます。
$ts = Get-Date -Format "yyyyMMdd_HHmmss"
Rename-Item $_.FullName -NewName "$($_.BaseName)_$ts.pdf"
別フォルダにリネームしたファイルを移動したい場合
$target = "C:\RenamedPDFs"
Rename-Item $_.FullName -NewName "$target\$($_.BaseName)_$hash.pdf"
フォルダは事前に作成しておく必要があります。
おわりに
このスクリプトを使うことで、PDF ファイルを中身に基づいて整理・識別することができ、重複や上書きの問題を避けることができます。バックアップやファイル収集作業などでの整理効率が向上します。