mac パスコピーは Option+Command+C|空白で壊れる理由まで

目的のファイルはFinderの窓に映っている。それを渡したいコマンドは、2つ隣のターミナルか、チャットの入力欄か、書きかけのスクリプトの中にある。この2点のあいだで、ファイルの場所を文字に変える作業が毎回発生します。よくある手順は、情報を見るを開いて「場所」の欄を目で追い、打ち直して、1回打ち間違える、という小さな儀式です。mac パスコピーで調べる人は、この儀式をやめる方法を探しています。標準のショートカットは用意されていて、押すのは1回で済みます。ただし、そのままだと3割前後のパスで失敗する落とし穴が1つあります。

標準の操作は Option+Command+C

Finderでファイルかフォルダを選んで Option+Command+C を押すと、POSIXパスと呼ばれる形式のパスがクリップボードに入ります。貼り付け先は問いません。

この機能があまり知られていないのは、メニューが修飾キーの後ろに隠れているからです。ファイルを選んだ状態で編集メニューを開くと「"ファイル名"をコピー」と出ます。ここでOptionキーを押し続けると、同じ項目が「"ファイル名"のパス名をコピー」に変わります。右クリックのメニューでも同じ入れ替わりが起きます。押している間だけ現れるメニュー項目はmacOSでは古くからある作法ですが、探していない人の目には映りません。

使う前に知っておくとよい性質が2つあります。

  • 複数選択するとパスも複数入ります。1行に1つずつ、Finderが並べている順で入るので、スクリプトに渡すファイル一覧を作る用途に使えます。ただし順序は現在の表示順であって、安定した基準ではありません
  • 何も選ばずに押しても何も入りません。中のファイルではなく、いま開いているフォルダ自身のパスが欲しいときは、パスバーでそのフォルダをクリックしてから押すか、Command+↑ で親フォルダへ上がって選択された状態にしてから押します

そして最大の注意点です。入るパスは生のままで、引用符も付かず、空白のエスケープもされません。/Users/name/Client Work/Q3 report.pdf のようなパスはこの形のまま貼り付けられ、シェルはこれを3つの別々の引数として読みます。警告は出ません。コマンドが失敗するか、最初の単語だけが一致する別のファイルに対して中途半端に成功します。

パスを取り出す5つの方法を並べる

コピー以外にも経路はあります。違いが出るのは、空白と日本語をどう扱うかという一点です。

方法 空白のエスケープ 複数まとめて 使える場所
Option+Command+C されない できる(1行に1つ) Finderの選択なら何でも
ターミナルの窓へドラッグ される できる(空白区切り) ターミナルのみ
シェルで pwd をクリップボードへ されない 現在地のみ ターミナルのみ
情報を見るの「場所」 該当しない 1つずつ Finderの選択なら何でも
パスバーで右クリック されない クリックしたフォルダのみ パスバーを出しているとき

この表で過小評価されているのがドラッグです。ファイルをターミナルの窓に落とすと、カーソルの位置にパスが挿入され、空白も特殊文字もエスケープされた状態になります。これはシェルが求めている形で、Option+Command+C が出してくれない形でもあります。コマンド名の後ろにファイルを1つ置きたいだけなら、コピーよりドラッグのほうが確実です。

情報を見るは、多くの人が最後に頼る方法でありながら、実は一番弱い選択肢です。「場所」の欄に出ているのは表示名を区切り記号でつないだもので、パスの形ではありません。読むためには役立ちますが、貼り付けるためのものではありません。

貼り付けたパスを生き残らせる3つの対処

貼り付けが壊れる原因はほぼ3種類で、それぞれ決まった対処があります。

空白と記号

貼り付けたパスを二重引用符で囲みます。引用符を打ち、貼り付け、もう一方の引用符を打つ。これで中身が何であっても1つの引数になります。空白、括弧、アンパサンド、日本語のファイル名がまとめて解決します。単一引用符でも同じことができますが、パスの中にアポストロフィが含まれていると壊れます。

末尾の改行

ターミナル側から pwd の結果をクリップボードへ送ると、pwd が出力する改行まで一緒に入ります。シェルに貼るぶんには行が確定するだけで実害は出にくいものの、チャットの入力欄やフォームやメモに貼ると、そこで送信されたり、文の途中に見えない改行が残ったりします。改行を付けずに送る書き方(printf を使って現在地だけを送る形)にしておくと、この事故は起きません。

チルダ

~ はシェルと「フォルダへ移動」の入力欄では展開されますが、それ以外の場所ではただの記号です。アプリのテキスト欄、設定ファイル、別のマシンにいる相手へのメッセージには、絶対パスの形で渡します。Option+Command+C は最初から絶対パスを返すので、この問題は資料から書き写したときや記憶で打ったときに起きます。

引用符を自動で付けるコピーを自作する

貼るたびに引用符を打つ方法は有効ですが、忙しいときに省略されるのもこの手の手作業です。macOSには、これを2つ目のショートカットに置き換える標準の仕組みがあります。

Automatorを開いて新規書類を作り、種類として「クイックアクション」を選びます。ワークフローが受け取る項目をFinderのファイルまたはフォルダに設定し、「シェルスクリプトを実行」を追加して、入力の渡し方を引数にします。スクリプトでは、受け取った引数を二重引用符で囲んで出力するだけで足ります。続けて「クリップボードにコピー」を置き、「引用符付きでパスをコピー」といった名前で保存すると、Finderの右クリックメニューのサービス欄にすぐ現れます。

ショートカットキーの割り当ては別の場所で行います。システム設定のキーボードにある「キーボードショートカット」の「サービス」、その中の「ファイルとフォルダ」の欄に、保存したクイックアクションと標準のサービス項目が並んでいます。ここでキーを割り当てられますし、メニューから消えている項目を有効に戻すこともできます。サービスが見当たらないと判断する前に、この一覧を確認する価値があります。

同じことはショートカットアプリでもできます。サービスメニューに表示する設定にして、ファイルを入力として受け取り、最後にクリップボードへコピーする流れを組めば、シェルスクリプトを書かずに同じ結果になります。Automatorは出力する文字を細かく決められる点が、ショートカットアプリは後から編集しやすくアカウント間で同期される点が、それぞれの持ち味です。

見た目どおりに動かないパスがある

形としては正しいのに、渡した先で失敗するパスがあります。先に見分けがつくと時間を失わずに済みます。

  • iCloud Drive。Finderでは上位の項目として並びますが、実際のパスは ~/Library/Mobile Documents/com~apple~CloudDocs に続く形です。パス自体は有効でも、クラウドに置いたままダウンロードしていないファイルは、手元には小さな代替ファイルとして存在しています。中身がまだ無い状態のファイルに対してコマンドを走らせることになります
  • マウントされたボリューム。外付けディスク、ディスクイメージ、ネットワーク共有はすべて /Volumes の下に、ボリューム名を次の階層として並びます。ディスクの名前を変えると、保存しておいたパスは効かなくなります。同じ名前のディスクを2台つなぐと、接続した順に応じて片方の末尾に番号が付きます
  • 大文字と小文字。macOSの標準のファイルシステムは区別しないため、綴りの大小が違っても手元では通ります。同じパスがコンテナのビルドやLinuxのサーバや、区別する設定の環境と共有しているリポジトリでは通りません。手元で動いて公開後に落ちる参照は、たいていこれです

もう1つ、渡す相手によっては絶対パスが不適切になる場合があります。リポジトリの中のファイルについて誰かに尋ねるときや、AIに読ませるときは、/Users/ から始まる絶対パスよりも、リポジトリの入口からの相対パスのほうが通じます。絶対パスには利用者のアカウント名が入るため、共有する文書に貼ると意図せず個人名が残ることもあります。Option+Command+C が返すのは常に絶対パスなので、共有前に頭の部分を削る一手間が必要になる場面がある、と覚えておくと事故が減ります。

そもそもコピーしないで済ませる

コピーされるパスには必ず目的があり、最も多い目的については、もっと短い経路が用意されています。Appleはこれをターミナルのユーザガイドに書いています。

パスバーでControlキーを押しながらフォルダをクリックし、以下のいずれかの操作を行います。新しいウインドウを開く: 「“ターミナル”で開く」を選択します。新規タブを開く:「サービス」>「フォルダに新規ターミナルタブ」と選択します。 出典: support.apple.com

パスバーが出ていない場合は、「表示」>「パスバーを表示」、またはOption+Command+Pで出せます。逆向きも短く、ターミナルで open . と打てばシェルの現在地でFinderの窓が開き、open -R にファイル名を続ければそのファイルを選択した状態で開きます。この2つとパスバーのメニューを覚えると、コピーの大半が消えます。cd の後ろに貼るためのコピーは、そもそも目的ではなかったからです。

残るのは窓と窓のあいだの往復

それでも残るのが、シェル以外の場所へパスを渡す場面です。AIへの指示文、メモ、課題管理のチケット、同僚へのメッセージ。ここは今でも、選択、ショートカット、アプリの切り替え、貼り付け、壊れていないかの確認という並びのままです。1日に何十回も繰り返されるこの動きが、そもそも検索の理由になっています。

この往復を減らす方向で作られている道具は、フォルダの一覧とシェルとAIへの指示を別々の窓に分けません。フォルダとターミナルとAIが同じ窓にある状態では、選んでいるフォルダがそのままシェルの作業ディレクトリであり、AIに渡す対象でもあるため、パスを文字にして運ぶ機会そのものが減ります。何をどこまで1つの窓に入れているかはできることにまとまっています。

置き換えを考えるときに見ておくとよいのは、既存のファイル管理アプリとの違いです。同じ「Finderの代わり」でも、2画面での転送に重心を置くものと、シェルとの連携に重心を置くものでは、減る手数の種類が変わります。機能の並びは他のファイル管理との比較に整理されていて、費用が見合うかどうかは料金で確かめられます。

まず変えるとよいのは、順番としては次の2つです。Option+Command+C を手に覚えさせ、シェルに貼るときは引用符を先に打つ癖を付ける。そのうえでパスバーを出し、「“ターミナル”で開く」を1週間使って、コピーしたパスのうち何割が cd の代わりだったかを数える。その割合が高いほど、変えるべきものはクリップボードの使い方ではなく、窓の並べ方のほうにあります。

よくある質問

Macでファイルのパスをコピーするショートカットは何ですか?

Finderで対象を選んで Option+Command+C です。Optionキーを押している間だけ、編集メニューと右クリックメニューの「コピー」が「パス名をコピー」に変わります。複数選択した場合は1行に1つずつ、選んだ数だけパスが入ります。

コピーしたパスがターミナルで通らないのはなぜですか?

引用符もエスケープも付かない生の形でコピーされるためです。空白を含むパスは、シェルに複数の引数として読まれます。貼り付けたパスを二重引用符で囲むか、ファイルをターミナルの窓へドラッグしてください。ドラッグの場合は空白が自動でエスケープされます。

いま開いているフォルダ自身のパスをコピーするにはどうしますか?

中のファイルではなくフォルダ側を選択します。パスバーを出してそのフォルダをクリックしてから Option+Command+C を押すか、Command+↑ で親フォルダへ上がると元のフォルダが選択された状態になるので、そこで押します。

コピーしたパスからFinderの場所を開き直せますか?

開けます。Finderで Shift+Command+G を押すと「フォルダへ移動」の入力欄が出るので、そこへ貼り付けます。絶対パスもチルダも受け付けます。ターミナル側からなら open . で現在地の窓が開き、open -R にファイル名を続けるとそのファイルを選択した状態で開きます。

記事一覧へ戻る