テクノロジー · 実用ガイド

Syncthingのバージョン履歴で、現在見つからないファイルを調べる

指定した月にアーカイブされたバージョンのうち、元のパスが現在存在しないものを時系列で確認します。確認できなかった項目も、見落とさず点検できる形で残します。

アーカイブ済みバージョンと現在のパスを比較するオリジナルの図です。存在するファイルは、存在しないパスと確認不能なパスの表から除かれます。現在存在しないold/report.txtはMissing pathsに分類されますが、移動と削除のどちらが原因かは特定しません。親ディレクトリがシンボリックリンクになっているパスは確認不能とし、Unknown pathsに分けて表示します。
架空のパスを使ったオリジナルの解説イラストであり、Syncthingのスクリーンショットではありません。存在しないパスの一覧が示すのは、確認時にパスがなかったという事実で、削除イベントの履歴ではありません。ファイルを移動した場合にも、同じように元のパスがなくなります。存在するパスは、存在しないパスと確認不能なパスの表から除かれます。親パスがシンボリックリンクのため確認できなかった項目は、別に残して確認します。 Watch at Ease

バージョン履歴が長くなると、予期せず見つからなくなったファイルを探すのは大変です。ここで確認したいのは、指定した月のバージョンが保存されているのに、このフォルダー内にはもう存在しないパスはどれか、という点です。名前を変更したファイルや移動したファイルも、元のパスがなくなっているため、該当することがあります。

以下の補助スクリプトは、選択したローカルのSyncthingフォルダーと、そのインスタンスが返す保存済みバージョンを比較し、単独で開けるHTMLレポートを作成します。存在しないパスと確認できなかったパスを分け、それぞれの保存済みバージョンをアーカイブ日時順に並べます。復元するかどうかは、レポートを確認したうえで自分で判断します。

必要な履歴が残っているか確認する

対象のバージョンをすでに保持しているデバイスを使います。Syncthingのバージョン管理は、デバイスごと、フォルダーごとに設定されます。他のデバイスから届いた変更によって影響を受けるファイルをアーカイブする仕組みであり、そのデバイス上で直接行った編集や削除は記録されません。

保存期間も重要です。選択した保存方式によっては、古いバージョンが期限切れになったり、間引かれたり、別のバージョンに置き換えられたりしています。今からバージョン管理を有効にしても、過去のコピーは再現できません。この確認の対象は、選択したインスタンスが現在も返す項目だけです。したがって、レポートが空でも、過去に何も削除されなかったとは断定できません。

対象月の基準は、そのバージョンがアーカイブに入った日時です。以前の編集に伴ってアーカイブされたファイルが、ずっと後になって見つからなくなることもあります。アーカイブ日時も、それ以前の更新日時も、現在のパスが消えた日時を示すものではありません。

インスタンス、フォルダーID、実際のフォルダーを一致させる

問い合わせ先のSyncthingインスタンスと同じマシン上で、同じファイルシステム環境から補助スクリプトを実行します。そのインスタンスのWeb画面で、フォルダーIDと設定されているフォルダーパスを確認してください。IDは、画面に表示されるフォルダーのラベルと同じとは限りません。--rootには、.stversionsディレクトリではなく、現在のファイルが置かれているフォルダーを指定します。

想定したストレージがマウントされ、読み取れることを確認します。フォルダー内に別のマウントがある場合は、それも対象です。それぞれの関連する場所から、見覚えのあるファイルを開いてみてください。ドライブが接続されていなくても、空のマウントポイントのディレクトリだけが残ることがあります。パスの文字列が一致するだけでは、意図したストレージが使える状態だとは確認できません。

補助スクリプトには、設定と一致する絶対パスのルートと、Syncthingのbasicファイルシステムが必要です。ルートとその上位の各ディレクトリは、シンボリックリンクではなく実際のディレクトリでなければなりません。設定されたパスに~が含まれる場合は、Syncthingと同じアカウントとホームディレクトリの対応を使います。コンテナー内のパスと、ホスト側のバインドマウントのパスは置き換えて使えません。一致しない場合は、実行環境またはパスを修正してください。

同期しているすべてのフォルダーの外にある既存のディレクトリを選び、作業場所と新しい出力ファイル名を決めます。補助スクリプトが確認するのは指定したルートだけで、同期対象の全フォルダーではありません。APIを利用するためSyncthingは起動したままにし、進行中の編集、移動、同期が落ち着いてから実行してください。結果は実行中に観測した状態であり、ある一時点を一括して捉えたスナップショットではありません。

補助スクリプトを保存して内容を確認する

通常のbasicファイルシステムを使用するPOSIXシステム上で、Python 3.12以降を使います。以下の1行全体をプレーンテキストエディターでunpack_audit.pyとして保存し、選んだ作業ディレクトリに置いてください。この1行には、補助スクリプトのソースと整合性の確認処理が含まれています。Pythonのこの行をBashに直接貼り付けないでください。実行前にpython3 --versionでバージョンを確認してください。古いバージョンのPythonでは、フォルダーやAPIを扱う処理に入る前に補助スクリプトが実行を拒否します。

import base64,zlib,hashlib,sys; from pathlib import Path; data=zlib.decompress(base64.b64decode('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',validate=True)); f=Path('audit.py').open('xb') if hashlib.sha256(data).hexdigest()=='71717f0699b0ab624944f1d8746eafff0d34f08f3cde079e98278112ed51d139' else sys.exit('SHA-256 mismatch; no helper file written'); f.write(data); f.close(); print('Created audit.py for inspection; it has not been run.')

そのディレクトリで次のコマンドを実行し、読める形の補助スクリプトを生成します。

python3 unpack_audit.py

展開用スクリプトはSHA-256を検証し、同名ファイルが存在しない場合にだけaudit.pyを作成します。再構成した補助スクリプトを実行することはありません。16,912バイトのaudit.pyのSHA-256は、71717f0699b0ab624944f1d8746eafff0d34f08f3cde079e98278112ed51d139である必要があります。APIキーを渡す前に、テキストエディターで開いて内容を確認してください。

この確認処理はフォルダー設定と保存済みバージョンを読み取り、ディスク上の現在のパスを調べます。新しく作られるHTMLファイルには完全なレポートJSONが含まれ、ネットワーク上のリソースや実行可能なJavaScriptは不要です。ファイルの復元や同期中の内容の変更は行いません。パスから個人情報が分かる場合は、レポートを公開しないでください。

コマンド履歴に残さずAPIキーを設定する

このローカルインスタンスのGUI設定からAPIキーをコピーします。APIキーはAPIへの認証情報なので、コマンド自体やスクリーンショット、レポートに含めないでください。Bashで以下を実行し、入力内容が表示されないプロンプトにキーを入力します。これらのコマンドは、現在のシェルの環境にだけキーを保存します。

read -r -s -p 'Syncthing API key: ' SYNCTHING_API_KEY && export SYNCTHING_API_KEY

既定の接続先はhttp://127.0.0.1:8384です。別のローカルポートや信頼できるHTTPSアドレスを使う場合は、--urlにそのインスタンスの直接のアドレスを指定します。認証情報やパスのプレフィックスを含むURLは拒否されます。リダイレクトには従わず、環境変数で設定されたプロキシも使用しません。APIと確認対象のフォルダーは、同じマシン上に置いてください。

UTCの暦月を1か月分確認する

例のフォルダーIDと絶対パスを自分の環境のものに置き換え、新しい出力ファイル名を指定します。この例の対象は2026年9月です。アーカイブ日時が2026-09-01T00:00:00Z以降で、2026-10-01T00:00:00Zより前のものが含まれます。

python3 audit.py --folder 'YOUR-FOLDER-ID' --root '/absolute/path/to/Sync' --month 2026-09 --output '/absolute/path/outside/Sync/report-2026-09.html'

オフセット付きのタイムスタンプは、UTCに変換してから比較します。たとえば2026-09-01T01:00:00+01:00は、このレポートでは9月の開始時点と完全に一致します。境界付近ではローカルの暦日と異なることがあるため、どの月を調べるかは、表示されるUTCの期間を基準に判断してください。

成功すると、コマンドは終了コード0で終了し、status: writtenと件数を含む短いJSONメッセージを表示します。新しいHTMLファイルをローカルのブラウザーで開いてください。エラーは、結果が空だったという意味ではありません。次のコマンドで、このシェルから認証情報を削除します。再試行するときは、入力内容が表示されないプロンプトで、もう一度キーを入力してください。

unset SYNCTHING_API_KEY

2026年9月を表すオリジナルのUTC時間軸です。9月1日午前0時を含み、10月1日午前0時は含みません。オフセットが+01:00の9月1日01:00は、対象に含まれるUTCの開始時点と一致します。同じ欠落パスの9月20日のバージョンは2行目のアーカイブ記録になりますが、2回目の削除を証明するものではありません。
架空のパスと検証に用いたタイムスタンプのパターンを示す、オリジナルの解説イラストです。UTCの対象期間には9月1日を含み、10月1日は含みません。オフセット付きのタイムスタンプを正規化すると、対象に含まれる開始時点になります。現在存在しない1つのパスに2つの保存済みバージョンがあれば、2行が出力されます。versionTimeは各バージョンがアーカイブされた日時であり、削除が起きた日時やファイルの最終更新日時ではありません。 Watch at Ease

存在しないパスと確認不能な項目を分けて読む

まずレポートのフォルダーと月を確認し、存在しないパスの項目を時系列で調べます。各項目は、確認時に元の相対パスが存在しなかったアーカイブ済みバージョンを表します。意図しない紛失だと判断する前に、名前を変更したり移動したりしたコピーが、現在のフォルダー内にないか探してください。

表では、重複を除いたパスの数と保存済みバージョンの数を別々に数えます。見つからない1つのパスに2行ある場合は、1つのパスに2つのバージョンがあるという意味で、2回削除されたという意味ではありません。完全なレポートJSONには、存在するパス、元のversionTimeとmodTimeの値、UTCに正規化した日時、size、current_path_state、state_reasonも含まれます。

unknownの項目もすべて確認してください。読み取れないパスや、対応していない親パスの解決方法では、存在しないと判断することはできません。示されたアクセスやパスの問題を修正し、新しいレポートに出力し直してください。最終的なパスそのものにシンボリックリンクがある場合は、そのリンク先が利用できなくてもpresentとして扱います。ただし、リンク先の内容が正常であることを保証するものではありません。

missingが0件でもunknownがある場合、そのパスについては確認が済んでいません。両方が0件なら、この確認は成功し、指定期間に返されたバージョンの中では、現在存在しないパスが見つからなかったという意味です。期限切れになった履歴、別のデバイスのバージョン、このアーカイブに一度も記録されていない欠落ファイルについては判断できません。

結論を出す前にエラーの原因に対処する

接続や認証のエラーが出たら、ローカルインスタンスが起動しているか、GUIのアドレスが正しいか、キーがそのインスタンスのものかを確認します。ルートが一致しない場合は、フォルダーIDと設定されたパスを一緒に確認してください。ドライブが利用できない場合やディレクトリを読み取れない場合は、先にアクセスを回復します。処理を先へ進めるためだけに、空の代替ディレクトリを作らないでください。

不正な形式の応答、対応していないパスやタイムスタンプ、想定外のフォルダー設定があれば、空の一覧を返すのではなく処理を停止します。APIやルートの問題では終了コード1と具体的なエラーを返し、コマンドの構文エラーでは終了コード2を返します。エラーを解消し、新しい出力ファイル名を選んでください。既存のレポートは保持されます。書き込みに失敗すると、不完全な新規ファイルが残ることがあります。再試行の前にそのファイルを確認して削除するか、別のファイル名を選んでください。

実行中にファイルが変更された場合は、処理が落ち着いてから確認を繰り返します。気になる項目について何か操作する直前にも、その状態を再確認してください。以前保存したレポートでは、その後ファイルが戻ったかどうかは分かりません。

自分で選んだバージョンだけを復元する

見つからないパスを確認し、特定の保存済みコピーが必要だと判断したら、Syncthingで同じフォルダーのRestore Versionsを開きます。Filter by nameとFilter by dateで項目を探し、パスと選択したバージョンを確認してからRestoreを実行してください。実際のタイムスタンプをレポートと比較します。GUIの日付表示が、レポートと同じUTCの月境界を使っているとは限りません。

復元したファイルが想定した現在のパスにあることと、その内容を確認し、Syncthingに復元エラーが表示されていないか調べます。古いバージョンを復元する前に、すでにある内容への影響を考慮してください。HTMLレポートは復元対象を選択しません。また、アーカイブされたどのコピーが作業に適切かを判断することもできません。

元のパスが存在するかの確認や、日付に基づく復元シミュレーションは、すでにRestorethingが提供している機能です。本ガイドでは、その先の確認作業をまとめています。UTCの1か月に返された全バージョンについて、現在存在しないパスを調べ、時系列のHTMLに整理し、確認不能な項目も表示します。内容を確かめて復元対象を決めた後は、Syncthing標準の復元機能を利用できます。

検証した内容と範囲

掲載した補助スクリプトは、Python 3.12.14/Linux上でローカルHTTPテストサーバーと実際の一時ファイルを使用し、28回のコマンドライン実行と29グループのアサーションに合格しました。APIからHTMLまでの処理、UTCの境界とナノ秒単位の並び順、パス数とバージョン数の区別、エスケープしたファイル名、missing・present・unknownの各状態、空の結果として扱ってはいけないエラーを確認しています。展開用スクリプトについても、別々のサブプロセスによる3ケースに合格しました。補助スクリプトを実行せず正確に再構成すること、破損データを拒否すること、既存の補助スクリプトを保持することです。

実際に稼働するSyncthingインスタンス、標準の復元GUI、Windows、macOSではテストしていません。アクセス拒否はテスト用に注入したもので、OSのアクセス制御規則を使った検証ではありません。同時に起きるファイルシステムやマウントの変更に対する安全性を確認したものでもありません。レポートは、パスが消えた理由を特定したり、移動と削除を区別したり、期限切れのバージョンを復元したりすることはできません。