mac file system structureを読む|表示名と実体のずれ
ターミナルで打ったパスと、Finderの画面に出ているフォルダの名前が一致しない。この違和感から「mac file system structure」を調べ始める人は多い。同じディスクを指しているのに、片方は「書類」と表示し、もう片方は ~/Documents と書く。どちらも正しく、両者は同じ場所を別の見せかたで表しているだけです。この記事では、その2つの見せかたの対応関係と、macOSがフォルダを分けている基準を整理して、どこに何を置けばよいかを判断できる状態まで持っていきます。
画面に出ている名前は、ディスク上の名前ではない
日本語環境のMacで最初に引っかかるのがここです。Finderのサイドバーには「書類」「デスクトップ」「ダウンロード」「ミュージック」と並んでいますが、ディスク上の実際のフォルダ名は Documents Desktop Downloads Music です。ターミナルで cd ~/書類 と打っても、そんなディレクトリは無いと返ってきます。
この対応表は、想像で作られたものではなく、macOSの中にファイルとして入っています。/System/Library/CoreServices/SystemFolderLocalizations/ja.lproj/SystemFolderLocalizations.strings を開くと、"Documents" => "書類"、"Applications" => "アプリケーション"、"Favorites" => "よく使う項目" といった行が並んでいます。Finderはフォルダを描くときにこの表を引き、実体の名前を日本語に置き換えて見せている。フォルダの名前そのものは英語のまま一度も変わっていません。
置き換えが起きるのは、macOSが最初から用意した標準フォルダだけです。自分で作った「請求書」というフォルダは、画面でも ls でも「請求書」のままです。つまり画面の日本語名には2種類あり、片方は翻訳で、片方は実名。ここを分けて見られるようになると、スクリプトに書くパスで迷わなくなります。
同じことは起動ディスクの名前でも起きています。「Macintosh HD」はディスクに付けられたラベルであって、パスではありません。ディスクユーティリティで名前を変えても、ルートは / のままです。
起動ディスクは1つに見えて、2つに分かれている
macOS Catalina以降、起動ディスクは1つのボリュームではありません。システム用とデータ用の2つに分かれていて、それが1つに見えるよう繋ぎ合わされています。稼働中のMacで mount を実行すると、ルートが sealed, local, read-only という状態で、別のボリュームが /System/Volumes/Data に付いていることが確認できます。
macOS 10.15 では、Appleは、システムコンテンツ専用の分離されたボリュームである、読み取り専用システムボリュームを導入しました。macOS 11 以降は、署名済みシステムボリューム(SSV)を含むシステムコンテンツに強力な暗号保護を追加します。 出典: support.apple.com
読み取り専用というだけでなく、システムボリュームの全バイトが暗号署名で封をされていて、起動のたびに検証されます。sudo を付けても /System の中に書き込めないのは、権限が足りないからではありません。書き換えた時点で署名が合わなくなる作りだからです。権限を上げる方向の対処は、この場所に対しては効きません。
では書き込める場所はどこか。2つのボリュームを繋いでいる接点は firmlink と呼ばれ、その一覧が /usr/share/firmlinks というテキストファイルに入っています。中を見ると /Applications /Library /Users /Volumes /opt /private /usr/local が並んでいます。起動ディスクの書き込める場所は、この一覧のどれかか、その下です。それ以外は封の内側になります。
この分けかたには実利があります。macOSのアップデートはシステムボリュームをまとめて入れ替え、データボリュームには触りません。OSを丸ごと書き換えるアップデートでも、アプリ・ホームフォルダ・自分で入れた開発ツールが残るのはこのためです。
ルートに並ぶものを、1行ずつ読む
| 場所 | 中身 |
|---|---|
| /Applications | 全ユーザー向けのアプリ。中の Utilities にシステム管理系がまとまる |
| /Library | このMacの全アカウントで共有する補助ファイル |
| /System | Appleのシステムそのもの。封がされていて書き換えられない |
| /Users | アカウントごとのホームフォルダと、共有用の Shared |
| /Volumes | 外付けディスクやネットワークボリュームの接続先 |
| /private | etc、tmp、var の実体。ルートからはリンクで届く |
| /usr | UNIX系のツール。書き込めるのは /usr/local だけ |
| /opt | Appleシリコン機で Homebrew が入る /opt/homebrew の親 |
Finderはこの層をまるごと隠しています。bin sbin usr private dev は、Finderのどのウインドウにも出てきません。さらに etc tmp var の3つはフォルダですらなく、private の中を指すシンボリックリンクです。他のUNIX系OS向けに書かれたソフトが期待する場所に、リンクだけを置いて辻褄を合わせている形になります。
隠れている場所へは、Finderからでも行けます。ウインドウを開いて command + shift + G を押し、パスを直接打てば移動できます。command + shift + ピリオドは、そのウインドウの隠し項目の表示を切り替えます。どちらもディスク上のファイルには何の変更も加えません。Finderが描く範囲を広げているだけです。
同じ名前のフォルダが3つあるのは、区分が3つあるから
macOSは、ファイルの種類ではなく「誰のためのものか」で置き場所を分けています。区分はユーザー・ローカル・ネットワーク・システムの4つです。同じ名前のフォルダが複数の階層に出てくるのは、この区分の数だけ同じ概念が繰り返されているからです。
~/Library/Fonts… そのアカウントだけで使うフォント/Library/Fonts… このMacの全アカウントで使うフォント/System/Library/Fonts… macOSに最初から入っているフォント。追加する場所ではない
置き場所を決めるとき、「これは何のファイルか」を考えても答えは出ません。「他に誰が必要としているか」で決まります。1人しか使わないなら ~/Library、全員が使うなら /Library。ここを間違えると、ログインし直しただけでフォントが消えたように見えます。
同じ理屈が、アプリ・環境設定ファイル・プリンタドライバ・常駐プロセスの設定にも当てはまります。バックアップで差が出るのもここです。ホームフォルダをコピーすれば ~/Library は付いてきますが、/Library は付いてきません。移行したあとで共有フォントや構成プロファイルだけが欠けているのは、この線をまたいでいたためです。
ホームフォルダの中で、隠されているもの
~/Library はFinderの初期状態では表示されません。移動メニューを開いたまま option キーを押すと項目が現れます。ここが隠されているのは保護のためではなく、手で触ると壊れやすいからです。中身はアプリが管理する前提で作られています。
現在のアプリの多くはサンドボックスの中で動くため、ホームフォルダに自由に書き込みません。それぞれに専用の入れ物が割り当てられ、~/Library/Containers/<アプリの識別子>/Data の下にホームフォルダとよく似た階層が作られます。画面上は「書類に保存した」ように見えても、実際にはそのアプリの入れ物の中に入っていて、他のアプリからは見えない、ということが起きます。
もう1つ間違えやすいのが iCloud Drive です。Finderのサイドバーではホームフォルダと並ぶ独立した項目に見えますが、実体は ~/Library/Mobile Documents/com~apple~CloudDocs です。ホームフォルダを走査するスクリプトは、画面のラベルとは似ても似つかないこの名前で遭遇します。しかも中の項目は、まだ本体をダウンロードしていない見出しだけの状態のことがあります。iPhoneやiPadから同じ保管場所に触るときに何が手元に残るかは、iPhone・iPadから続きをで扱っている論点と重なります。
外付けとネットワークは /Volumes に生える
/Volumes は保存場所ではありません。ディスクが接続されるたびに接続先が作られ、取り外すと消える、入れ替わりの激しい場所です。ここを固定のパスとして扱うと事故が起きます。同じ名前のディスクをもう1台つないだ場合、macOSは後から来たほうに番号を足して Backup 1 のような名前にします。/Volumes/Backup と書いたスクリプトは、その瞬間から意図しないディスクを触り始めます。
もう1つ、/Volumes の中には起動ディスクの名前をした項目も並んでいます。これはディスクではなく / を指すシンボリックリンクです。起動ディスクは /Volumes の下にマウントされているわけではなく、ルートそのものです。リンクが置いてあるのは、/Volumes/Macintosh HD/Users/... という書き方でも辿り着けるようにするためです。
自分の物をどこに置くか
| 置きたいもの | 置き場所 |
|---|---|
| 書類・案件データ・ソースコード | ホームフォルダの下ならどこでもよい |
| 自分だけが使うスクリプト | ~/bin を作って PATH に足す |
| 全アカウントで使うコマンド | /usr/local/bin |
| 1人だけが使うアプリ | ~/Applications |
| 全員が使うアプリ | /Applications |
表の下にある考え方は1つです。区分の線と喧嘩しないこと。個人のものはホームフォルダに置けば、バックアップにも入り、権限で詰まることもなく、OSのアップデートでも消えません。マシン全体のものはローカルの区分に置き、管理者権限で扱う。システムの区分に置きたくなったときは、権限を緩める方向ではなく、置き場所の判断を見直す合図だと考えるほうが早く片づきます。
表示と実体のずれは、そのまま往復の回数になる
ここまで見てきたずれは、知識の問題として終わりません。作業時間の問題として残ります。ターミナルで pwd が返すパスと、Finderのタイトルバーに出ているフォルダ名が一致しないとき、人は頭の中で変換をしています。「書類」は Documents、サイドバーの iCloud Drive は Mobile Documents/com~apple~CloudDocs、この置き換えを1日に何度も繰り返す。1回あたりは数秒でも、窓を切り替えるたびに発生します。
対処の方向は2つに分かれます。1つは、隠し項目を常時表示にしてFinder側を実体に寄せる方法。もう1つは、フォルダとターミナルを別々の窓に置くのをやめる方法です。後者はフォルダとターミナルとAIが同じ窓にある形にすることで、画面に映っているフォルダとシェルの作業ディレクトリが常に同じ場所を指すようにします。パスを目で読み替える工程そのものが消えるので、変換の手間は回数ではなくゼロになります。どちらが自分に合うかは、いま何回窓をまたいでいるかで決まります。
そのうえで道具を比べるなら、価格と対応範囲を並べて見たほうが早いです。他のファイル管理アプリとの違いは他のファイル管理との比較に条件ごとに整理してあり、どこまで無償で試せるかは料金に出ています。日本語環境で使えるかどうかが気になる場合は、対応している表示言語の一覧が対応言語にあります。
よくある質問
Finderで「書類」と出ているのに、ターミナルで ~/書類 が見つからないのはなぜですか?
ディスク上の実際のフォルダ名は Documents で、Finderが表示するときだけ日本語に置き換えているためです。対応表はmacOSの中にファイルとして入っており、標準フォルダにだけ適用されます。自分で作った日本語名のフォルダは、画面でもターミナルでも同じ名前のままです。
sudoを付けても /System に書き込めないのはどうしてですか?
システムボリュームが読み取り専用でマウントされているうえに、全バイトが暗号署名で封をされていて、起動のたびに検証されるためです。権限の問題ではないので、管理者権限を使っても通りません。全アカウント向けに何かを足すなら /Library か /usr/local を使います。
~/Library がFinderに表示されないのですが、開く方法はありますか?
移動メニューを開いたまま option キーを押すと項目が現れます。command + shift + G でパスを直接打っても開けます。隠されているのは保護のためではなく、手作業で変更するとアプリが壊れやすいからで、開くこと自体に問題はありません。
外付けディスクのパスをスクリプトに書いても大丈夫ですか?
/Volumes の下は接続のたびに作り直される場所なので、固定のパスとして扱うのは危険です。同じ名前のディスクが2台つながると、後から接続したほうに番号が足された名前になります。ディスクの名前ではなく、UUIDや識別子で指定するほうが安全です。