macOSのコマンドラインでスクリーンショットを自動化する
macOSのscreencaptureループで、全画面、固定領域、ページめくりのスクリーンショットを撮影する方法を、安全なファイル名とトラブルシューティングとともに説明します。
13分で読めます生産性作成者:Temposhot Team
すべてのMacには、システムのスクリーンショットショートカットの背後で動作する screencapture コマンドが含まれています。zshのループから呼び出すと、追加のソフトウェアなしで全画面または固定領域を一定間隔で撮影できます。この投稿では、ループを一つずつ組み立て、ページめくりを加え、よく発生する失敗の修正方法を紹介します。
コマンドを調べる前に権限を確認する
screencapture は、それを起動したアプリの権限で実行されます。Terminal では、Terminal に Screen Recording(画面収録)の権限が必要です。権限がなくてもコマンドは成功しますが、画像には壁紙とメニューバーしか写りません。
System Settings を開き、Privacy and Security を選択して、画面収録のリストでお使いのターミナルアプリ(Terminal、iTerm など)をオンにします。ラベルの表記は macOS のバージョンによって異なります。設定を変更したら、ターミナルアプリを終了して開き直します。
テスト撮影で権限を確認する
テスト撮影で、macOS がターミナルに画面の読み取りを許可しているかを確認できます。複数のウィンドウを開いた状態で撮影し、ファイルを開きます。ウィンドウが写っていれば、権限は有効です。壁紙とメニューバーしか写らない場合は、権限がないか、設定を変更した後にターミナルを再起動していません。
確認が終わったら、テスト用のファイルを削除します。全画面の画像のため、非公開の内容が写っている可能性があります。
ターミナルから1枚撮影する
ループを書く前に、1回の撮影から始めます:
screencapture -x ~/Desktop/test.png
open ~/Desktop/test.png
-x フラグはシャッター音をオフにします。開いた複数のウィンドウが画像に写っていれば、権限とパスは正しく動作しています。お使いの macOS がサポートするすべてのフラグは man screencapture で確認できます。
この投稿で使うフラグ
フラグは大文字と小文字を区別します。-c は画像をクリップボードにコピーし、-C は画像にポインタを含めます。フラグは screencapture -x -m -t jpg file.jpg のように、それぞれ別の引数として組み合わせます。
-T の遅延は、screencapture コマンドを実行するたびに適用されます。ループ内で使うと、すべてのフレームに遅延が加わります。遅延を一度だけ入れたい場合は、ループの中で sleep を使います。
全画面を数秒おきに撮影する
このループは、開始時刻にちなんだ新しいフォルダに、3秒間隔で20枚撮影します:
#!/bin/zsh
out=~/Captures/run-$(date +%Y%m%d-%H%M%S)
mkdir -p "$out"
for i in {1..20}; do
screencapture -x -m "$out/frame-$(printf %04d $i).png"
sleep 3
done
echo "Saved 20 frames to $out"
「frame-0001.png」のようなゼロ埋めの名前にすると、Finder や名前順で並べ替えるツールでも撮影順のまま表示されます。-m フラグは撮影をメインディスプレイに限定します。このフラグがないと、ディスプレイが2台あるMacでは、ディスプレイごとに1つのファイル名が必要になります。セカンダリディスプレイを撮影する場合は、-D 2 を使います。
スクリプトを capture.sh として保存し、chmod +x capture.sh を実行してから ./capture.sh で起動します。途中で止めるには Control+C を押します。保存済みのフレームはフォルダに残ります。
実行時間を計算する
このループは、最後の撮影の後もスリープします。そのため、20フレームの実行では合計60秒スリープします。各撮影にも短い時間がかかるため、実際の実行時間はスリープの合計よりやや長くなります。以下のタイムラインは、撮影時間を除いています。
実行時間を指定して設定するには、時間を間隔で割ります。1フレームを5秒ごとに撮影して10分間実行する場合は、600を5で割り、120フレームになります。ループの回数を120に、スリープを5に設定します:
for i in {1..120}; do
screencapture -x -m "$out/frame-$(printf %04d $i).png"
sleep 5
done
1回の撮影に0.2秒かかる場合、120回の撮影で24秒が加算されるため、実行時間は約624秒になります。お使いの Mac での撮影時間は time screencapture -x ~/Desktop/timing.png で測定し、その後テスト用のファイルを削除します。
検索しやすいようにフレームに名前を付ける
手順名を含めると、実行後にフレームを探しやすくなります。同じ $out フォルダ内で、手順名のリストをループします:
steps=(login dashboard export)
for s in $steps; do
screencapture -x -m "$out/$s.png"
sleep 2
done
タスクごとにフォルダを1つ用意すると、整理しやすくなります。フォルダ名の日時で実行開始時刻がわかり、タスク名で対象の内容がわかります。Captures/onboarding-run-20261103-101500 のようなフォルダ名にすると、同じ日の2回の実行を区別でき、各ファイルを開かずに目的の実行を探せます。
スペースを含まない名前にすると、シェルで引用符の問題が起きにくくなります。撮影順が重要で手順名が重要でない場合は、ゼロ埋めの番号を残します。
ループを正しく停止する
Control+C を押すと、ループはすぐに止まります。保存済みのフレームはフォルダに残りますが、スクリプトは要約を出力しません。ループの上に trap を追加すると、割り込み時にフレーム数を出力できます:
trap 'echo "Stopped after $i frames"; exit 0' INT
INT は Control+C が送るシグナルです。trap は、シグナルを受け取った時点の $i を読み取るため、開始されたフレームの最後の番号を報告します。撮影中に停止すると、最新のファイルが不完全になることがあります。PDF ツールでフォルダを開く前にそのファイルを削除するか、前のフレームとサイズを比較してください。
固定領域を繰り返し撮影する
-R x,y,w,h を追加すると矩形を撮影できます。値はポイント単位で、メインディスプレイの左上隅を基準にします:
screencapture -x -R 200,120,1200,800 "$out/frame-$(printf %04d $i).png"
領域の座標を調べるには、Shift+Command+4 を押し、領域の左上隅と右下隅にある十字線の横に表示される数値を確認します。幅は右端から左端を引いた値、高さは下端から上端を引いた値です。以下の表は、この手順で使うキーを示しています。
固定の矩形はウィンドウを追いかけません。実行中にウィンドウが移動したり、ディスプレイの配置が変わったりすると、後のフレームでは別の領域が撮影されます。
Retina ディスプレイでポイントをピクセルに換算する
-R の値はポイント単位ですが、保存されるファイルはピクセル単位です。Retina ディスプレイでは、縦横それぞれ1ポイントが2ピクセルに対応するため、1200×800ポイントの矩形は2400×1600ピクセルの画像として保存されます。スケーリングの設定によって倍率が変わるため、値を推測せず、保存されたフレームを測定してください:
sips -g pixelWidth -g pixelHeight "$out/frame-0001.png"
以下の比較は、2倍のディスプレイと1倍のディスプレイで二つの領域を撮影したときの保存サイズを示しています。
ピクセル単位での切り抜きやデザイン仕様にはピクセルの値が必要です。ポイント単位で計画した撮影には、-R にポイントの値を指定します。単位を混在させると、計画したレイアウトより大きいまたは小さいフレームができます。
PNG の代わりに JPG で保存する
-t jpg を使い、拡張子を変更します:
screencapture -x -t jpg "$out/frame-$(printf %04d $i).jpg"
PNG はテキストの輪郭を鮮明に保つため、インターフェースの撮影では安全な既定値です。JPG はファイルサイズが小さいため、数百フレームの実行では効果があります。このコマンドは pdf と tiff も指定できます。
長い実行に合う形式を選ぶ
500フレームの実行では、選んだ形式で500個のファイルが作られます。フォルダのサイズが重要で、テキストの輪郭の鮮明さがそれほど重要でない場合は JPG を選びます。読者が小さいラベルを拡大して読む必要がある場合は PNG を選びます。スクリプトでは -t png を明示し、形式がコード上で見えるようにします。
長い実行の前に、各形式で1フレームずつ撮影して比較します。ファイルに du -h を実行し、サイズにフレーム数を掛けて、フォルダのサイズを見積もります。
各スクリーンショットの間にキーを押して、ページを飛ばさない
スライドや電子書籍のページを送るには、撮影ごとにキー操作が必要です。osascript は System Events を通してキーを送信します。キーコード124は右矢印キーです:
pages=30
for i in {1..$pages}; do
screencapture -x -m "$out/page-$(printf %04d $i).png"
if (( i < pages )); then
osascript -e 'tell application "System Events" to key code 124'
sleep 1.5
fi
done
ページの取りこぼしや余分なページを防ぐ要点は三つあります。撮影を先に実行するため、開始ページも保存されます。if 文は最後の撮影の後のキー操作を省くため、読者が最終ページを超えて進むことはありません。キーの後の sleep は、次の撮影の前に次のページが描画される時間を与えます。
System Events はキーを最前面のアプリに送信します。そのため、ループを開始する前に読書アプリのウィンドウをクリックするか、先頭に sleep 5 を追加してアプリを切り替える時間を確保してください。ターミナルがキーイベントを送るには、Accessibility(アクセシビリティ)の権限が必要です。
ページめくりのキーコード
osascript は、入力される文字ではなく、macOS の仮想キーコードでキーを識別します。以下のコードは、ページめくりや確認によく使われるキーを示しています:
| キー | コード |
|---|---|
| 左矢印 | 123 |
| 右矢印 | 124 |
| 下矢印 | 125 |
| 上矢印 | 126 |
| Space | 49 |
| Return | 36 |
一部のリーダーは、特定のコントロールにフォーカスがあるときだけページが送られます。長い実行の前に3ページの実行でキーを試し、各ページが変わることを確認してください。
撮影とキー操作の順序
ループ内の順序によって、各フレームに表示されるページが決まります。このセクションのループは、先に撮影してから、キーを押します。以下のフローは1サイクルを示しています。
キーを先に押した場合、すべてのフレームが画面上のページの次のページを表示し、最初のページは保存されません。
キー後の sleep が速度を決めます。ローカルファイルから描画されるページは、この投稿で使う1.5秒のスリープ内に完了することが多いです。ネットワーク越しに画像を読み込むリーダーでは、一部のページで3〜5秒が必要になることがあります。最初のページではなく、文書内で最も遅いページを確認してください。画像の多いページが最小の待ち時間を決めるためです。
長い実行の前に、ページめくりの誤りの多くは次の二つの確認で見つけられます:
- 3ページ撮影し、3枚のフレームを開きます。各フレームは、順番どおりに異なるページを表示している必要があります。
- 最後のフレームと、文書の最終ページを比べます。最後のフレームがページを重複して表示している場合、キーを一回多く押したか、スリープが短すぎます。
長い実行でMacをスリープさせない
ディスプレイがスリープすると、フレームは黒くなります。スクリプトを caffeinate で囲みます。caffeinate はスクリプトの実行中、スリープ防止のアサーションを保持します:
caffeinate -di ./capture.sh
-d フラグはディスプレイをスリープさせず、-i はアイドル時のスリープを防ぎます。caffeinate は Mac をスリープさせませんが、画面のロックは解除されません。画面がロックされている間に撮影したフレームには、アプリではなくロック画面が写ります。電源に接続したMacで、蓋を閉じた状態でも動作させる場合は -s を追加します。caffeinate のマニュアルには、このフラグは Mac が AC 電源で動作している間のみ有効と書かれています。
screencapture ループの失敗を解決する
| 症状 | 原因 | 対処 |
|---|---|---|
| 壁紙とメニューバーしか写らない | 画面収録の権限がない | ターミナルアプリを許可し、開き直す |
| 「No such file or directory」 | 出力フォルダがない | ループの前に mkdir -p を実行する |
| 撮影ごとに二つの画像またはエラー | ディスプレイが複数あり、ファイル名が一つ | -m または -D 1 を追加する |
| 黒いフレーム | ディスプレイがスリープした | caffeinate -di でスクリプトを実行する |
| ページが飛ばされる | ページの描画前にキーを送信した | キー後の sleep を長くする |
| キー操作が無視される | Accessibility(アクセシビリティ)の権限がない、または最前面のアプリが違う | ターミナルアプリを許可し、対象のウィンドウをクリックする |
出力フォルダを確認する
実行が完了すると、実行ごとに1つのフォルダができ、フレーム名は撮影順に並びます。以下のツリーは、2026年11月3日10時15分0秒に開始され、4フレームを撮影した実行を示しています。フレーム5から20も同じパターンに従います。
同じ内容のフレームが並ぶ原因を調べる
すべてのフレームが同じ内容を示している場合は、次の原因を順番に確認します:
- 撮影の間に対象が変わっていない。ループは画面上にあるものを保存するため、ページがめくれない場合や、ダイアログが開いたままの場合、同じフレームができます。キー操作を追加するか、待ち時間を長くしてください。
- 別のウィンドウが対象を覆っている。
-Rと-mが撮影するのは画面の領域であり、その背後のウィンドウではありません。対象のウィンドウを前面に出し、実行中は前面のままにしてください。 - 間隔が変化の速さより短い。10秒ごとに動く進行バーは、1秒間隔では静止しているように見えます。ループを変更する前に、より長い間隔でフレームを確認してください。
2つのファイルが異なるかどうか不明な場合は、shasum -a 256 で最初と最後のファイルを比較します。ハッシュが一致すれば、ピクセルが同一であることが確認できます。
各実行の後にファイル数を数えてください。20フレームの実行では、20個のファイルが残るはずです。数が少ない場合は、ループが途中で止まったか、撮影が失敗したことを意味します。ターミナルに表示されたメッセージを確認してください。
スクリプトが簡単な選択肢でなくなったとき
シェルループは、毎回同じように動く固定の作業に向いています。新しい要件を加えるたびにコードが増えます。例えば、時刻で停止する、一時停止と再開をする、名前でウィンドウを選ぶ(-l フラグは、macOS が一覧表示しないウィンドウ ID を必要とします)、検索可能なPDF を作る、といった要件です。
Temposhot の Auto Capture は、これらを設定に置き換えます。サムネイルから Screens、Windows、Custom Area のいずれかを選び、停止条件として Screenshots、Duration、End time のいずれかを設定します。キーを記録するには Key press フィールドを使います。フローティングツールバーで実行を一時停止、再開、終了できます。書き出しは PNG、JPG、ZIP、検索可能なPDF、MP4、GIF に対応しています。WebP は、Mac に WebP エンコーダがある場合にのみ表示されます。
スクリプトの各選択肢を設定に対応させる
スクリプトの各判断には、対応する Auto Capture の設定があります。以下の手順は、Temposhot でページめくりのループを再現します:
切り替える前に、スクリプトのどの部分がまだ必要かを決めてください。Auto Capture は一般的なケースに対応します。具体的には、1つのディスプレイ、1つのウィンドウ、または1つの矩形を時間間隔で撮影し、フレーム間で任意のキー操作を行うケースです。撮影の間に任意のシェルコマンドを実行することはできないため、スプレッドシートからファイル名を変更するなど、独自のロジックを持つスクリプトはシェルに残します。
この投稿の例に対応する設定は次のとおりです:
- 3秒スリープの20フレームループは、Screenshots の停止条件を20、間隔を3秒にすることに対応します。
- 5秒ごとに1フレームを撮影する10分間の実行は、Duration の停止条件を10分、間隔を5秒にすることに対応します。Duration と End time では、間隔を0より大きい値にする必要があります。
- ページめくりのループは、Key press に Right Arrow、間隔を1.5秒にすることに対応します。Key press は Pro の機能で、Accessibility の権限が必要です。
- 固定の矩形は Custom Area に対応します。オーバーレイに必要な幅と高さが表示されるまで、矩形をドラッグします。
無料プランでは、1回のセッションで撮影できるスクリーンショット数に上限があります。フレーム数がそれを超える実行には、Temposhot Pro が必要です。
スクリプトの既定値と異なる設定が二つあります。カウントダウンの既定値は3秒で、ページを開始状態に戻す時間を確保できます。開始ボタンを押した後に対象の読み込みに時間がかかる場合は、5秒または10秒に設定してください。間隔の既定値は1秒なので、実行ごとに明示的に設定してください。
固定の作業にはスクリプトを使う
作業が固定されていて、同じコマンドがすべてのマシンで実行される場合はスクリプトを使います。例えば、cron ジョブが起動する、ローカルのダッシュボードの夜間撮影です。スクリプトはバージョン管理にも向いており、タイミングや領域の変更を記録できます。
Temposhot のセッションは、画面を見ている人が実行し、質問のために一時停止し、アプリ内で結果を得たい作業に向いています。どちらでも同じフレームを作成できます。違いは、手順を誰が管理するかです。スクリプトはファイルに保存され、Auto Capture の設定はアプリに保存されて、保存された既定値に従います。
FAQ
screencapture はファイルをどこに保存しますか?
最後の引数で指定したパスに保存します。-c を指定すると、代わりに画像をクリップボードにコピーします。
screencapture でカーソルを含めることはできますか?
はい。-C を追加するとポインタが含まれます。この投稿のすべてのコマンドのような非対話的な撮影でのみ動作します。
最初の撮影の前に遅延を入れるには?
単一の撮影には -T 5 で5秒の遅延を指定するか、ループの前に sleep 5 を置きます。
フレームを PDF や動画にできますか?
はい。Image to PDF は、フレームを名前順に1つの PDF にまとめます。Images to Video は、フレームを動画に変換します。どちらもブラウザで動作し、ファイルは Mac 上に残ります。
screencapture で1つのウィンドウだけを撮影できますか?
はい。-l と数値のウィンドウ ID を指定します。ターミナルではウィンドウ ID を一覧表示しないため、ID は別のツールから取得する必要があります。Auto Capture の Windows タブでは、サムネイルからウィンドウを選択できます。
フレーム9999の後に、並び順がずれるのはなぜですか?
%04d 形式は、少なくとも4桁で出力します。フレーム10000からは、frame-10000.png のような名前が名前順で frame-9999.png より前に並びます。9999フレームを超える実行では %05d を使ってください。
Control+C の後もフレームは残りますか?
はい。割り込みの前に保存されたフレームは、フォルダに残ります。上のセクションの trap は、スクリプトが停止したときにフレーム数を出力します。
繰り返しのスクリーンショットを完成した成果物にする
スクリプトが固定の領域と固定の数を超えて大きくなったら、代わりに Auto Capture を試してください。自動撮影ガイド はすべてのオプションを説明しており、ダウンロードページ には Apple シリコン向けのビルドがあります。
command-linescreencapturezshscreenshot-automation
このページで使用する用語: retina screenshot, screenshot automation, screenshot timer
繰り返し撮影するスクリーンショットを、完成したデータに仕上げます
Temposhotは、タイマーまたはクリックごとに撮影し、結果をPDF、画像、ZIP、MP4で書き出します。
関連記事
- Mac で Automator を使って連続スクリーンショットを撮る方法Take Screenshot と Loop を使った Automator のスクリーンショット ワークフローを作成し、連番のファイルが必要な場合はシェルアクションを使用します。
- Shortcuts アプリでmacOSのスクリーンショットを自動化するMac の Shortcuts で一定間隔のスクリーンショットを撮影し、設定した時刻やアプリの起動時にショートカットを実行する方法と、スクリプトや画面収録の権限の修正方法を説明します。
- 標準ツールで Mac のスクリーンショットを自動化する方法screencapture、Automator、Shortcuts を使って Mac のスクリーンショットを自動化する方法を説明します。権限の設定、安全なループの組み方、トラブルシューティングを扱います。
- Mac のスクリーンショット自動化とは何か?Mac でスクリーンショット自動化が何を意味するか、手動のスクリーンショットや画面収録とどう違うか、専用の撮影ワークフローがいつ必要になるかを説明します。