本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。
born-digital(最初からデジタルで作られた記録)やデジタル化したファイルをアーカイブに移管するとき、その中身に「どんなフォーマットが・どれだけ・どんなリスク付きで含まれているか」を機械的に棚卸しする工程があります。Brunnhilde は、その特性記述(characterization)をまとめて行うためのコマンドラインツールです。
この記事では、Brunnhilde を macOS(Apple Silicon)に導入し、サンプルのファイル群に対して実行して、フォーマット識別のレポートが出るところまでを確認します。ウイルススキャン(ClamAV 連携)については別の記事で扱ったため、ここではフォーマット識別を中心に、ClamAV 連携は無効化(-n)して進めます。
ツールの関係
Brunnhilde は単独の識別エンジンではなく、いくつかのツールを呼び出して 1 つのレポートに集約するラッパーです。核となるのが Siegfried(フォーマット識別)で、ClamAV(ウイルススキャン)や bulk_extractor(PII = Personally Identifiable Information、個人情報のスキャン)は任意で呼べる構成になっています。

それぞれの役割は次のとおりです。
- Siegfried: ファイルの中身(バイト列)を PRONOM(英国国立公文書館のフォーマット登録簿)の署名と照合し、フォーマットを PUID(PRONOM Persistent Unique Identifier、例:
fmt/18)で同定します。Brunnhilde の必須依存です。 - ClamAV: ウイルススキャン。任意で、
-n/--noclamで無効化でき、Windows では自動スキップされます。 - bulk_extractor: PII などのパターン抽出。
-bを付けたときだけ走ります。 - tree など: ディレクトリ構造を
tree.txtに出力する補助的な処理です。ディスクイメージを入力にする場合は、抽出のために tsk_recover(SleuthKit)や fiwalk、unhfs(HFSExplorer)なども呼ばれます。 - チェックサムは、Brunnhilde が md5deep のような外部ツールを使うのではなく、Siegfried のハッシュ出力(
sf -hash、既定は md5)を利用します。重複判定もそのハッシュ列をもとに行われます。
BitCurator や SIP Creator との階層関係
これらのツールは「BitCurator → Brunnhilde → Siegfried → …」のように一直線で語られることがありますが、各段の「含む」が指す関係は段ごとに異なります。具体的には、環境がツールを「同梱」する関係、ラッパーやアプリがツールを「呼び出す」関係、ツールがデータを「参照」する関係の 3 種類が混ざっています。

整理すると次のようになります。
- BitCurator は、アーキビスト向けの Ubuntu ベースの環境(ディストリビューション)で、Brunnhilde や Siegfried、bulk_extractor などを「同梱」しています。Brunnhilde 経由だけでなく、Siegfried 単体も直接バンドルしている点に注意してください。
- Brunnhilde は、実行時に Siegfried や(有効なら)ClamAV を子プロセスとして「呼び出す」ラッパーです。Siegfried は必須依存です。
- Siegfried の下にあるのはツールではなく、PRONOM 署名データベース(+任意で Wikidata / freedesktop MIME)という「データ」です。
- CCA-Public/sipcreator(SIP Creator)は、Brunnhilde を「呼び出す」GUI アプリです。BitCurator とは別のコードベースで、BitCurator に内包される一部ではなく、Brunnhilde を利用する側という横並びの関係になります(ただし「BitCurator 4 での利用を想定」と説明されており、BitCurator 環境内で動かすことが多い点には注意してください)。
各層は単体でも動くため、今回のように BitCurator を使わずに macOS 上で Brunnhilde → Siegfried を動かせますし、sf を直接実行することもできます。
セットアップ
Siegfried は Homebrew、Brunnhilde は Python パッケージ(pip)で導入します。ディレクトリ構造の出力に使う tree も入れておきます。
# Siegfried(フォーマット識別エンジン、必須依存)
brew install richardlehane/digipres/siegfried
sf -version
# ディレクトリツリー出力に使う(無いと tree.txt が空になるだけで実行は通る)
brew install tree
# Brunnhilde 本体(システム Python を汚さないよう venv に入れる)
python3 -m venv .venv-brunnhilde
.venv-brunnhilde/bin/pip install brunnhilde
Homebrew で入れた Siegfried は署名データベースを同梱しており、今回は siegfried 1.11.4 / 署名 default.sig(2026-06-06 時点)でした。Brunnhilde のバージョンは 1.9.6 です。
導入後のエントリポイントは brunnhilde.py という名前になります(brunnhilde ではありません)。
サンプルデータを用意する
移管記録を模したサンプルを生成するスクリプトを使います。PDF / PNG / DOCX / XLSX / CSV / TXT の形式バリエーションに加えて、Brunnhilde のデモが映えるよう、あえて重複ファイルと未識別になりやすいファイル(.dat)を混ぜたツリーを作ります。
sample-data/2026-移管-対象部署
├── その他/unknown_export.dat
├── 移管メモ.txt
├── 議事録/_バックアップ_第1回議事録.pdf
├── 議事録/2024年度第1回_議題メモ.docx
├── 議事録/2024年度第1回運営委員会_議事録.pdf
├── 議事録/2024年度第2回運営委員会_議事録.pdf
├── 写真/式典_2024.png
├── 写真/式典_2024_集合写真.png
├── 名簿/教職員名簿_2024.csv
└── 名簿/教職員名簿_2024.xlsx
議事録/2024年度第1回運営委員会_議事録.pdf と 議事録/_バックアップ_第1回議事録.pdf は中身が同一で、重複検出のデモになります。
実行する
ClamAV 連携を外して(-n)、入力ディレクトリと出力先を指定します。
.venv-brunnhilde/bin/brunnhilde.py -n sample-data out/brunnhilde-test

出力先には、人間が読む report.html、Siegfried の生結果 siegfried.csv、集計済みの csv_reports/(formats.csv / duplicates.csv / warnings.csv など)、tree.txt が並びます。
レポートを見る
report.html をブラウザで開くと、フォーマット別の集計、重複ファイル、未識別ファイル、警告などが 1 ページにまとまっています。

今回のサンプルでの結果は次のようになりました。
| 指標 | 値 |
|---|---|
| 総ファイル数 | 10 |
| ユニークなファイル数 | 9(重複 1 組を含む) |
| 識別済みフォーマット数 | 7 |
| 未識別ファイル | 0 |
フォーマット別の集計は次のとおりです。PDF が 3、PNG が 2、その他が各 1 件で、想定どおりに分類されました。
| フォーマット | PUID | 件数 |
|---|---|---|
| Acrobat PDF 1.4 | fmt/18 | 3 |
| Portable Network Graphics | fmt/11 | 2 |
| Plain Text File | x-fmt/111 | 1 |
| Microsoft Word for Windows | fmt/412 | 1 |
| Microsoft Excel for Windows | fmt/214 | 1 |
| Data File | fmt/1730 | 1 |
| Comma Separated Values | x-fmt/18 | 1 |
中身が同一の 2 つの PDF は、同じチェックサム(dd3eecbb…)として重複に挙がりました。
「未識別 0」だが「拡張子のみで識別」が 2 件
レポート上は「未識別ファイル 0」ですが、warnings.csv を見ると .dat と .csv の 2 件に match on extension only(拡張子のみで一致)という警告が付いていました。
File,...,Basis for ID,Warning
.../その他/unknown_export.dat,...,extension match dat,match on extension only
.../名簿/教職員名簿_2024.csv,...,extension match csv,match on extension only
これは、バイト列の署名では同定できず、拡張子だけを根拠に PUID を割り当てたという意味です。Siegfried は拡張子から fmt/1730(Data File)や x-fmt/18(CSV)を付けるため、集計上は「識別済み」に入りますが、確信度は署名一致より低い扱いになります。fmt/1730(Data File)はそもそも PRONOM 側で「署名がまだ無い .dat 系を拡張子だけで受けるための総称(catch-all)」として定義されている項目で、拡張子のみ一致の典型例です。プレーンテキスト系(CSV など)や中身の決まっていない .dat で起きやすく、特性記述の結果を読むときは、この警告も併せて確認すると実態に近い把握ができます。
補足
- 実行時に
tree: command not foundが出ても、tree.txtが空になるだけで識別処理自体は完了します。ディレクトリツリーを残したい場合のみbrew install treeを入れておきます。 - ClamAV 連携を含めて確認したい場合は別記事(macOS での ClamAV 動作確認)で扱っています。常駐型アンチウイルスが入った環境では、テスト用ファイルがオンアクセススキャンで隔離される挙動があるため、注意が必要です。
- 検証で導入した Brunnhilde の venv は、不要であれば
rm -rf .venv-brunnhildeで削除できます。

コメント
…