Claude Codeの/exportコマンドで会話をテキスト保存する
/exportはClaude Codeの会話をプレーンテキストで書き出すコマンドです。ファイル名指定の有無で挙動が変わり、スクリプトから読みたいときは別の手段を使います。
Claude Codeのセッション内で /export と打つと、その会話がプレーンテキストとして書き出されます。ファイル名を付けずに実行するとクリップボードコピーかファイル保存を選ぶダイアログが開き、ファイル名を付けて実行すると確認なしでそのファイルに直接書き込まれます。挙動の違いを押さえておくと、手作業でのコピーと自動化の両方に使い分けられます。
/exportとは何をするコマンドか
/export は現在の会話を、メッセージとツール出力を人間が読める形式に整形して書き出すコマンドです。バグ報告の添付、レビュー依頼、社内wikiへの貼り付けなど、会話を人に見せる目的で使います。「何をどう指示したらこう動いた」という経緯をそのまま残せるので、コードの意図を後から説明するドキュメントとしても使い道があります。
引数なしで /export を実行すると、クリップボードへのコピーとファイル保存のどちらかを選ぶダイアログが開きます。ファイル名を渡すと、このダイアログを飛ばして指定したファイルへ直接書き込みます。
/export
/export today-debug-session.txtファイル名を省略する運用は、会話の一部だけ選んで貼り付けたいときや、保存先をその場で決めたいときに向きます。ファイル名を指定する運用は、後述のようにスクリプトの一部として自動化したいときに向きます。
ファイル名の有無で何が変わるか
この2つの呼び出し方は、単に手順が短くなるだけでなく、確認ステップの有無という実質的な違いを生みます。
| 呼び出し方 | 挙動 | 向いている場面 |
|---|---|---|
/export(引数なし) | 挙動ダイアログが開き、クリップボードコピーかファイル保存を選ぶ | 向いている場面保存先を都度決めたい、コピーだけしたい |
/export <filename> | 挙動ダイアログを介さず、指定ファイルへ直接書き込む | 向いている場面保存先が決まっている、手順化・自動化したい |
ファイル名を付けた場合、既存の同名ファイルを上書きするかどうかの確認は挟まりません。デバッグセッションのログをまとめて残す運用では、日付やセッション名を含んだファイル名を都度指定する方が事故を防げます。
書き出されるテキストには、送ったプロンプトとClaudeの応答文に加えて、実行したツール呼び出しの結果(コマンドの出力やファイルの差分など)も読める形でレンダリングされます。生のログをそのまま貼るのではなく、人が追いやすい形に整形されている点が /export の特徴です。
過去のセッションを開いてからexportする
/export は今アクティブなセッションの会話だけが対象です。別の日に作業したセッションを書き出したいときは、先にそのセッションを開き直してから /export を実行します。
| コマンド | 動作 |
|---|---|
claude --continue | 動作カレントディレクトリで最後に作業したセッションを再開 |
claude --resume | 動作セッションピッカーを開いて選ぶ |
claude --resume <name> | 動作名前を指定したセッションを直接再開 |
/resume(セッション内) | 動作別の会話へ切り替える |
claude --resume <session-id> はどのディレクトリからでも実行できます。まずカレントプロジェクトとそのgit worktreeを探し、見つからなければ他の全プロジェクトを横断して探します。該当するトランスクリプトを持つプロジェクトが1つに絞れたときだけ解決するので、手動でコピーした重複ファイルがあっても誤って別セッションを開くことはありません。
claude --resume を引数なしで実行するとセッションピッカーが開きます。名前を付けていなければAI生成のセッションタイトルや会話の要約、最初のプロンプトが行ごとに表示され、上下キーで選び Enter で再開します。Space キーで中身をプレビューでき、Ctrl+A を押すとこのマシン上の全プロジェクトのセッションまで表示範囲を広げられます。目的のセッションがどのPull Requestに紐づくものか分かっているなら、検索欄にそのPR URLを貼り付けるだけで作成元のセッションを絞り込めます。書き出したい会話が見つかったら Enter で再開し、そこで /export を実行します。
再開したセッションには、ツール呼び出しと結果を含む会話の全履歴が復元されます。つまり /export で書き出されるのは、そのとき画面に見えている要約ではなく、セッションが持つ完全な履歴です。一方でモデルやMCP設定、--add-dir で追加したディレクトリのような一部の起動時フラグは自動では引き継がれません。再開時にコマンドの挙動そのものを再現したい場合は、元の起動オプションを付け直す必要があります。
スクリプトから会話を読みたいときは/exportを使わない
/export が作るのは人間が読むための整形済みテキストです。スクリプトで会話データをパースしたいなら、Claude Codeは目的別に別のインターフェースを用意しています。
- 非対話実行の結果をそのまま構造化データで受け取りたい:
claude -pに--output-format jsonまたはstream-jsonを付けて実行すると、結果・セッションID・使用量・コストがJSONで返ります - 既存セッションに追加の質問を投げて答えを取得したい:
claude -p --resume <session-id>でセッションIDを指定して質問を送り、応答を構造化データで受け取ります - セッションのイベントに反応してスクリプトを動かしたい: hookやステータスライン向けに渡される
transcript_pathを読みます。SessionEndhookでセッション終了時にトランスクリプトをアーカイブする、といった使い方ができます - TypeScriptやPythonのアプリに会話処理を組み込みたい: Agent SDKでメッセージをプログラムから直接受け取ります
セッションIDを指定して要約を取得する例は次の通りです。
claude -p --resume <session-id> --output-format json "summarize what we changed" | jq -r '.result'/export とこれらのインターフェースは、同じ会話データを違う消費者に向けて出す手段だと考えると使い分けやすくなります。人が読むなら /export、プログラムがパースするならJSON系の出力形式です。
transcript_path を使う方法は、セッション終了のタイミングで何かを自動実行したいときに向いています。SessionEnd フックにトランスクリプトのパスが渡されるので、フック側でそのファイルをアーカイブ用ストレージへコピーする、といった処理を組めます。Agent SDKを使う方法は、Claude Codeをアプリの内部に組み込み、会話のメッセージをプログラムから逐次受け取りたい場合に選びます。単発のスクリプトで結果だけ欲しいのか、アプリに常時組み込みたいのかで、選ぶインターフェースが変わってきます。
元データのJSONLファイルを直接パースしない
会話は自動的にJSONL形式でローカルに保存されています。保存先は既定で ~/.claude/projects/<project>/<session-id>.jsonl で、<project> は作業ディレクトリのパスを元にした名前です。パス中の英数字以外の文字はハイフンに置き換えられ、変換後の名前が200字を超える場合は200字に切り詰めたうえでフルパスのハッシュ値が付加されます。1行ごとにメッセージ・ツール使用・メタデータいずれかのJSONオブジェクトが入っています。
このJSONLファイルを自作スクリプトで直接パースするのは避けたほうがよい選択です。エントリのフォーマットはClaude Code内部の実装に紐づいており、バージョン間で変わる可能性があります。会話データをスクリプトで扱いたい場合は、/export か前述の各インターフェースを使うのが公式に案内されている方法です。
保存先や保持期間は設定で変更できます。
| したいこと | 設定する項目 | 場所 |
|---|---|---|
保存先を ~/.claude 以外に移す | 設定する項目CLAUDE_CONFIG_DIR | 場所環境変数 |
| 既定30日の保持期間を変える | 設定する項目cleanupPeriodDays | 場所settings.json |
| 全モードでトランスクリプトの書き込みを抑止する | 設定する項目CLAUDE_CODE_SKIP_PROMPT_HISTORY | 場所環境変数 |
| 1回の非対話実行だけ書き込みを抑止する | 設定する項目--no-session-persistence | 場所claude -p のCLIフラグ |
社外秘のコードを扱うセッションでは cleanupPeriodDays を短く設定するか、機密性の高い1回限りの実行では --no-session-persistence を付けて、そもそもディスクに残さない選択肢もあります。トランスクリプトの肥大化や長時間セッションでの扱いに関する運用の勘所は、Claude Codeのセッションを快適に保つ5つの習慣にまとめています。
どの設定が向くかは目的によって分かれます。複数マシンで作業していてトランスクリプトを共有ドライブへ集約したいなら CLAUDE_CONFIG_DIR で保存先ごと移動させます。監査要件でログを一定期間だけ残したいなら cleanupPeriodDays で保持期間を明示します。CI上で一時的に実行するだけでトランスクリプトを一切残したくないケースもあります。その場合は環境変数を毎回設定するより、claude -p の起動オプションとして --no-session-persistence を渡す方が、そのジョブに閉じた設定にできます。
--output-format json によるスクリプト連携は、CIパイプラインへ組み込む場合にも使う手法です。GitHub Actions上でClaude Codeを動かす具体例はClaude CodeをGitHub Actionsに組み込むを参照してください。
よくある質問
/exportで書き出したファイルはどこに保存されるか
ファイル名を指定した場合はカレントディレクトリを基準に指定パスへ書き込まれます。引数なしでダイアログからファイル保存を選んだ場合は、ダイアログ上で保存先を指定します。
/exportとJSONLのトランスクリプトファイルはどちらを使えばよいか
人が読む・共有する目的なら /export、スクリプトでパースする目的なら claude -p --output-format json などの構造化出力インターフェースを使います。JSONLファイルを自前でパースする実装は、フォーマット変更で壊れるリスクを抱えます。
古いセッションの会話も/exportできるか
/export は現在アクティブなセッションの会話が対象です。過去のセッションを書き出したい場合は、claude --resume <session-id> や /resume でそのセッションを再開してから /export を実行します。
セッションピッカーに古いセッションが表示されない場合は
トランスクリプトの保持期間は既定30日です。cleanupPeriodDays の設定を変更していなければ、それより前のセッションはすでに削除されており、セッションピッカーにも /export の対象にも出てきません。長期保存したい会話がある場合は、期限が切れる前に /export で書き出しておくか、cleanupPeriodDays を延ばしておく必要があります。
まとめ
/export はファイル名の有無で「ダイアログを開いて選ぶ」か「指定ファイルへ直接書き込む」かが変わり、後者は手順の自動化に組み込みやすい形です。会話をスクリプトで処理したいときは /export ではなく --output-format json 系のインターフェースか transcript_path を使います。トランスクリプトの保存先・保持期間は CLAUDE_CONFIG_DIR や cleanupPeriodDays で調整できるので、機密性の高いプロジェクトでは併せて見直すとよいでしょう。書き出したい会話が今のセッションでなければ、claude --resume のセッションピッカーで先に見つけてから /export を実行する、という2段階の流れを覚えておくと迷いません。