mac フォルダパス取得の4つの方法|貼る先で使い分ける
目的のフォルダはFinderの窓に開いています。それなのに、そのフォルダが「どこにあるのか」を文字で渡そうとした瞬間に手が止まる。ターミナルのプロンプト、設定ファイルの1行、AIへの指示文、同僚へのメッセージ。渡す先はいろいろですが、画面に見えているフォルダから文字列を取り出す方法だけがすぐに出てきません。mac フォルダパス取得で調べ始めるのは、たいていこの場面です。答えはショートカット1つではありません。Finderからパスを取り出す経路は4つあり、出てくる文字列は3種類に分かれます。貼った先でパスが効かない原因のほとんどは、この使い分けを外していることにあります。
パスを取り出す4つの方法と、出てくる文字列
追加のソフトを入れなくても、標準の状態で次の4つが使えます。
パス名としてコピー
Finderでフォルダを選び、Option+Command+Cキーを押します。画面には何も起きませんが、クリップボードにはPOSIX形式のフルパスがそのままの文字列として入っています。同じ項目は「編集」メニューにもありますが、Optionキーを押している間しか表示されないため、存在に気づかないまま何年も使っている人が多い操作です。複数のフォルダを選んで実行すると、1行に1つずつパスが並んだ状態でコピーされます。
パスバーから取る
「表示」>「パスバーを表示」を選ぶと、Finderの窓の下端に親フォルダの並びが出ます。この並びのどこかをControlキーを押しながらクリックすると、同じ「パス名としてコピー」が現れます。いま開いているフォルダまで移動しなくても、途中の親フォルダのパスだけを取り出せるのが利点です。同じ名前のフォルダが2つある環境で、いま開いているのがどちらなのかを確かめる用途にも使えます。
ターミナルへドラッグする
開いているターミナルの窓にフォルダをドラッグすると、カーソル位置にパスが入力されます。このときのパスは空白がエスケープ済みで、末尾に半角スペースが1つ付きます。4つの方法の中で、シェルにそのまま渡せる形の文字列が出てくるのはこれだけです。この違いは後述するとおり、見た目の差以上の意味を持ちます。
情報を見る
フォルダを選んでCommand+Iキーを押すと、「場所」の行に階層が表示されます。ただしここに出るのはFinderの表示名で、システムフォルダは日本語名になり、区切りはスラッシュではなく矢印です。読むためのものであって、貼るためのものではありません。日本語環境のMacで「場所」の文字列をそのままターミナルに貼って動かない、という詰まり方はここから来ています。
| 方法 | クリップボードに入るもの | シェルにそのまま貼れるか | 複数選択 |
|---|---|---|---|
| Option+Command+C | 生のPOSIXパス | 不可(引用符が必要) | 可。1行に1つ |
| パスバーをControlクリック | 生のPOSIXパス | 不可(引用符が必要) | 不可 |
| ターミナルへドラッグ | エスケープ済みパス | 可 | 可 |
| Command+Iの「場所」 | 表示名の階層。パスではない | 不可 | 不可 |
コピーそのものを省く経路もあります。Appleのマニュアルは次のように書いています。
Finderウインドウのパスバーを使用して、作業ディレクトリをあるフォルダの場所に設定した状態で、新しい「ターミナル」ウインドウやタブを開くことができます。 出典: support.apple.com
パスバーでフォルダをControlクリックし、「“ターミナル”で開く」を選べば、そのフォルダが作業ディレクトリになった状態で窓が開きます。コピーも貼り付けも要りません。ただし新しい窓が増えるので、後半で触れる「窓の数」の問題そのものは残ります。
生のパス、エスケープ、引用符は別の文字列
ホームフォルダの直下に「Client Files」という名前のフォルダがあるとします。これを文字にすると、正しい表記が3つできます。生のまま書けば /Users/name/Client Files、エスケープすれば /Users/name/Client\ Files、引用符で囲めば "/Users/name/Client Files" です。
どれか1つが正解なのではなく、貼る先ごとに正解が変わります。生のパスを cd の後ろに貼ると、シェルは空白を区切りとして読み、引数が2つあると解釈して「そんなディレクトリはない」と返します。エスケープ済みのパスをYAMLやJSONの設定値に貼ると、バックスラッシュがそのまま値の一部になり、どこも指さない文字列になります。引用符付きのパスをFinderの「フォルダへ移動」に貼ると、引用符まで名前の一部として検索されます。
迷わないための線引きは単純です。2つだけ覚えておけば足ります。
- シェル以外に貼るものはOption+Command+Cで取る
- シェルに貼るものはドラッグで入れる。すでに生のパスを持っているならダブルクォートで囲む
手でバックスラッシュを足すのは避けたほうが安全です。後からパスの一部を書き換えたとき、引用符は壊れませんが、エスケープは書き換えた箇所だけ抜け落ちます。
チルダ(~)にも同じ注意が要ります。シェルは引用符の外にある ~ をホームフォルダに展開しますが、"~/Documents" のように引用符の中に入れると展開しません。さらに、シェル以外のほとんどの場所では ~ はただの記号です。設定ファイル、アプリの入力欄、AIへの指示文に渡すときは、/Users/name/... の形まで展開してから渡してください。
コピーしたパスと、実際の置き場所がずれるとき
正しくコピーしたパスが効かないことがあります。macOSは同じ場所に複数の名前を与えているためです。
- iCloudのデスクトップと書類。この設定を入れると、デスクトップと書類はホームフォルダの中の普通のディレクトリではなくなり、実体は
~/Library/Mobile Documents/com~apple~CloudDocs/の下に移ります。Finderは見慣れた側のパスをコピーし、それは問題なく開きます。ところがrealpathでリンクをたどってから文字列を比べるスクリプトは、別のフォルダだと判定します - まだ手元に降りていないファイル。ストレージの最適化が働いていると、一覧にフルパスが出ていても中身はiCloud側にあります。開こうとした時点で取得が始まり、オフラインなら失敗します。スクリプトの中で起きると、通信の問題には見えません
- ボリューム名の衝突。外付けディスクは
/Volumes/の下にマウントされます。同じ名前のディスクをもう1台つないだり、前のマウントが解放される前に挿し直したりすると、後から来たほうが/Volumes/Backup 1になります。前に書き留めたパスは別のディスクを指すか、どこも指さなくなります - システムとデータの分離。いまのmacOSはシステム側とユーザーデータ側が別ボリュームで、firmlinkでつながっています。多くの道具は
/Users/name/...を返しますが、/System/Volumes/Data/Users/name/...を返す道具もあります。どちらも同じ場所の正しい名前です - サンドボックスの中のアプリ。コピーしたパスは、いまのユーザーが読める場所を指しています。サンドボックスで動くアプリは、ダイアログでの許可やフルディスクアクセスがないとそのパスを開けません。パスは正しく、権限だけが足りない状態ですが、エラーの文面はたいてい「ファイルが見つからない」です
逆向きに、パスからフォルダを開く
自動処理を触っていると、逆向きのほうが回数が増えます。テキストとしてパスを受け取り、その場所をFinderで見たい場面です。
Finderでは、Shift+Command+Gキーで「フォルダへ移動」が開きます。ここに貼ってReturnキーを押します。
フォルダの正確な名前と場所が分かっている場合は、パス名を入力することで開くこともできます。 出典: support.apple.com
同じページには、先頭のスラッシュがボリュームの最上位を意味すること、末尾のスラッシュがファイルではなくフォルダを指すこと、チルダがユーザーごとのホームフォルダを指すことも書かれています。パスの一部だけでも候補が出るので、長いパスを貼るより断片を打つほうが速い場面も多くあります。
シェル側からは open . で作業ディレクトリをFinderで開けます。ファイルを指定して open -R /path/to/file と打つと、そのファイルを選択した状態で親フォルダが開きます。コマンドの結果を見た後に「他に何が入っているのか」を確かめたくなるのは自然な流れなので、覚えておく価値があるのは後者のほうです。
別のMacに渡した瞬間に壊れるパス
パスはその1台の中だけで成り立つ事実です。共有物に書き込むと、そこから壊れ始めます。
ホームフォルダの直書きが最初の失敗です。/Users/hana/projects/api は1台のMacでだけ正しく、他のすべてで誤りです。スクリプトでは $HOME、手順書では ~ を使い、コミットされたファイルの中に /Users/ で始まる絶対パスを見つけたら不具合として扱ってください。
大文字と小文字が2つ目です。標準のAPFSボリュームは入力した大文字小文字を保存しますが、照合するときは区別しません。そのため Assets/Logo.png と assets/logo.png は手元では同じファイルを開きます。大文字小文字を区別するボリューム、Linuxのビルドサーバー、多くのコンテナイメージはこれに同意しません。失敗は手元では再現せず、パイプラインの中だけで出ます。
Unicodeの正規化が3つ目で、これは画面から判別できません。日本語のフォルダ名は、濁点を別の符号として持つ形と、1文字にまとまった形の2通りで保存され得ます。表示は完全に同じです。Finderからコピーしたパスと、手で打ったパスを文字列として比較すると、見た目が一致しているのに一致しないという結果になります。
長さが4つ目です。macOSの PATH_MAX は sys/syslimits.h で1024バイトと定義されています。説明的な長い名前で階層を深く切ると、ビルドツールが末尾に独自の文字列を足した時点で届いてしまうことがあります。
パスをコピーした回数を1週間だけ数える
ここまでの方法はすべて、同じ形の問題への対処です。フォルダの一覧は1つ目のアプリにあり、そのフォルダに対して実行するコマンドは2つ目のアプリにあり、何をすべきかを相談する相手は3つ目のアプリにいる。パスは、その間を人の手で運ばれている糊です。
動作を1日分だけ正直に数えると形が見えます。選ぶ、Option+Command+Cを押す、窓を切り替える、cd と打つ、貼る、名前に空白があるので引用符を足す、Returnキーを押す。7つの動作で、1回あたりは数秒です。作業フォルダが変わるたびに繰り返されるため、1日の合計は無視できる量ではなくなります。そして本当の損失は時間ではありません。切り替え先を間違えた窓にパスを貼ると、意図していないディレクトリに対してコマンドが走ります。
ここに効くのがフォルダとターミナルとAIが同じ窓にあるという配置です。一覧とコマンド入力が同じ作業ディレクトリを共有していれば、フォルダを移動した時点でプロンプトの位置も動きます。コピーの操作が速くなるのではなく、コピーという工程そのものが消えます。この配置で何ができるのかはできることに、2画面型やターミナル常駐型など別の半分を解いている道具との違いは他のファイル管理との比較に整理してあります。
順序としては、まずパスバーの表示とOption+Command+Cの2つを今日入れてください。ここまでで、手打ちで済ませていたコピーの大半が置き換わります。そのうえで1週間、コピーした直後に別の窓へ貼っているかどうかだけを数えます。回数が少なければ配置を変える必要はありません。多いなら、それはパスの取り方の問題ではなく、窓が分かれていることの問題です。判断の材料が足りない場合はよくある質問も確認できます。
よくある質問
Finderからコピーしたパスが、cdの後ろに貼ると動かないのはなぜ?
Finderは生のパスをコピーするため、フォルダ名に空白があると、シェルはそこで引数が分かれていると解釈します。貼ったパス全体をダブルクォートで囲むか、フォルダをターミナルにドラッグしてください。ドラッグの場合はエスケープ済みの文字列が入ります。
コピーせずにフルパスを目で確かめる方法はある?
「表示」>「パスバーを表示」を選ぶと、Finderの窓の下端に親フォルダの並びが出ます。Commandキーを押しながら窓のタイトルをクリックしても同じ階層がメニューで表示され、そのまま親フォルダへ移動できます。
情報を見るウインドウの「場所」は貼り付けに使える?
使えません。あそこに出ているのはFinderの表示名で、システムフォルダは日本語名になり、区切りもスラッシュではなく矢印です。読むための表示なので、貼る用途にはOption+Command+Cを使ってください。
スクリプトがデスクトップのパスを別物として扱うのはなぜ?
iCloudのデスクトップと書類を有効にしていると、実体は ~/Library/Mobile Documents/com~apple~CloudDocs/ の下にあり、見慣れたパスはリンク経由でそこへ届いています。どちらも同じフォルダを開きますが、リンクをたどってから文字列を比べる道具は別の場所だと判定します。