mac 隠しファイル検索の手順|.gitやドットファイルを見つける
.zshrc を直したい。.env がどこにあるか確かめたい。プロジェクトの .git が壊れていないか見たい。mac 隠しファイル検索という言葉で調べる人は、たいていこのどれかで手が止まっています。ややこしいのは、隠しファイルが1種類ではないことと、画面の検索とコマンドとで「隠す」の意味が違うことです。この記事では、Macで隠されているファイルの3つの種類を分けたうえで、画面から見る方法とコマンドで探す方法を順に整理します。
Macで「隠れている」ファイルは3種類ある
同じように見えなくても、隠れている理由は3つに分かれます。理由が違えば、表示させる方法も違います。
1つ目は、名前がドットで始まるファイルとフォルダです。.zshrc、.gitignore、.env、そして .git ディレクトリがこれにあたります。これはmacOS固有の仕組みではなくUNIXの慣習で、名前の先頭がピリオドであること以外に特別な属性はありません。
2つ目は、ファイルシステム側で不可視の印が付いているものです。ボリュームの直下にある /usr や /bin、/private といったシステムのディレクトリが該当します。名前はドットで始まっていませんが、フォルダの窓には出てきません。
3つ目は、ライブラリフォルダのように、印ではなく設定で隠されているものです。ホームフォルダ直下の ~/Library は、アプリの設定や保存データが入る場所で、標準では表示されません。
この3つを分けておく価値は、対処が変わるところにあります。1つ目と2つ目はキーボードの操作でまとめて表示できますが、3つ目は表示メニューやフォルダの設定で個別に扱います。「隠しファイルが出ない」と言うとき、どれの話なのかを先に決めると、試す手順が1つに絞れます。
画面から見るときの3つの入口
いちばん短いのはキーボードです。フォルダの窓を開いた状態でCommand+Shift+ピリオドを押すと、隠されている項目が半透明の状態で表示されます。もう一度押すと元に戻ります。設定を書き換えるわけではないので、確認が済んだら押して戻す使い方ができます。
2つ目の入口が、パスを直接打つ方法です。Command+Shift+Gで入力欄が開き、~/Library や /usr/local のように打てば、隠れているかどうかに関係なくその場所が開きます。Appleのユーザガイドはこの動きを次のように書いています。
フォルダの正確な名前と場所が分かっている場合は、パス名を入力することで開くこともできます。 出典: support.apple.com
行き先が分かっているときは、これが最短です。入力欄はチルダ記号や環境変数を解釈するので、~/.ssh のようにドットで始まるフォルダも直接開けます。
パスが分からない場合でも、途中まで打てば候補が出ます。入力欄はタブキーで補完が効くため、~/Li まで打って続きを補うといった使い方ができます。深い階層にあるアプリの設定フォルダを開くとき、この補完があるだけで打ち間違いが減ります。
3つ目が、ライブラリフォルダの扱いです。ホームフォルダを開いた状態でOptionキーを押しながら表示メニューを開くと、一覧にライブラリの項目が現れます。この操作の間だけ見える形で、常時表示したい場合は、ホームフォルダを開いて表示メニューから表示オプションを開き、ライブラリフォルダを表示する設定を入れます。
隠しファイルを検索の結果に出したい場合は、また別の指定が必要です。フォルダの窓で検索を始め、プラスボタンで条件を足し、「その他」からシステムファイルの扱いを選ぶと、結果に含める指定ができます。この操作を経ないかぎり、画面の検索結果に隠しファイルは並びません。
コマンドから探すときの書き方
シェルの側から見ると、隠しファイルは特別なものではありません。ls -a を打てばドットで始まる項目も並びますし、find は最初から隠しファイルを対象に含めています。
find ~/work -maxdepth 4 -name ".env" 2>/dev/null
find ~ -maxdepth 3 -type d -name ".git" 2>/dev/null
ドットで始まる名前をまとめて出したいときは、find . -name ".*" と書きます。パターンを引用符で囲むのは、シェルが先に展開してしまうのを防ぐためです。深さを -maxdepth で切り、権限エラーを 2>/dev/null で捨てると、結果が読める量に収まります。
ホームフォルダの直下に何が置かれているかを一度確かめておくのも有効です。ls -la ~ | head -30 と打つと、普段は見えないドットファイルが並びます。シェルの設定、エディタの設定、各種ツールの認証情報が同じ階層に同居している様子が分かり、次に探すときの当たりが付けやすくなります。
注意が必要なのは mdfind の側です。Spotlightの索引はドットで始まるファイルやシステムの領域を通常は取り込まないため、隠しファイルを mdfind で探しても空で返ることが珍しくありません。ここで「ファイルが無い」と判断せず、find に切り替えるのが正しい順番です。索引に載っているかどうかは mdls ファイル名 で確かめられます。
中身から探す場合は、道具ごとの既定値の差がそのまま結果の差になります。macOSに入っているgrepは隠しファイルも見に行きますが、ripgrep と fd は初期状態でドットファイルと .gitignore に書かれたファイルを飛ばします。
rg --hidden -uu "AWS_SECRET" ~/work
fd -HI "^\.env" ~/work
grepで見つかるのに rg では出てこない、という状態は不具合ではなく、この既定値の違いです。設定ファイルや認証情報を探すときは、--hidden と -uu、あるいは -HI を付けるかどうかで結果が変わります。
.gitを探すときに気をつけること
.git は、ドットで始まるという意味では他のドットファイルと同じですが、探す目的が少し違います。多くの場合、目的は「どこがリポジトリになっているか」を知ることです。
ホームフォルダ以下のリポジトリを洗い出すなら、ディレクトリに限定して探します。find ~ -maxdepth 4 -type d -name ".git" のように深さを切ると、待ち時間が短くなります。深さを切らずにホーム全体を歩くと、キャッシュや依存パッケージの中まで入り込んで、目的と関係ない結果が大量に混じります。
find ~ -maxdepth 4 -type d -name ".git" -exec dirname {} \; 2>/dev/null
dirname を挟むと、.git そのものではなくリポジトリのルートが一覧されます。実務で必要になるのはたいていこちらの形です。
もう1つ知っておきたいのは、.git が必ずディレクトリとは限らないことです。サブモジュールやワークツリーとして作られた場所では、.git は本体の場所を書いた1行のファイルになります。-type d だけで探すと、この形のものは結果から漏れます。両方を拾いたい場合は -name ".git" だけで探し、後から種類を確かめる形にします。
目的が「リポジトリの状態を知ること」なら、探した後にもう一手を足せます。見つかったルートに対して git -C パス status --short を回すと、変更が残っている場所だけが一覧になります。手元に何十個のリポジトリがあり、どれを片づけていないのかを思い出せない状態は、この一手で解けます。
同じ考え方で、リモートを確かめる形も使えます。git -C パス remote -v を回すと、どこへ紐づいているリポジトリなのかが並びます。バックアップや整理の前に、手元にしか無いものと、送信済みのものを分けて把握しておくと判断が早くなります。
削除にも注意が要ります。.git を消すと、そのフォルダの履歴は失われます。整理のつもりでリポジトリの中身を一括削除する操作は、戻せない結果になりやすい部分です。中身を確かめるだけなら、git -C パス status のように場所を指定して読み取るだけの操作で足ります。
手段ごとの扱いを1つの表にする
同じ「隠しファイルを探す」でも、道具によって既定の扱いが違います。打つ前に選ぶための材料として並べておきます。
| 手段 | ドットファイル | 無視設定の対象 | 全部を含める指定 |
|---|---|---|---|
| フォルダの窓 | 表示に切り替えが必要 | 対象外 | Command+Shift+ピリオド |
| フォルダの検索 | 条件の追加が必要 | 対象外 | その他からシステムファイルを指定 |
| mdfind | 通常は索引に無い | 対象外 | 指定では解決しない |
| find | 最初から対象 | 対象外 | 不要 |
| grep -r | 最初から対象 | 見る | 不要 |
| rg・fd | 既定では飛ばす | 既定では飛ばす | --hidden -uu / -HI |
この表で読み取ってほしいのは、mdfind の行だけ性質が違うという点です。他の行は指定を足せば対象に入りますが、索引の側に取り込まれていないものは、どんなフラグを足しても出てきません。隠しファイルを探すときに mdfind を第一手にしないのは、この違いが理由です。
隠しファイルの扱いは、フォルダの窓と保存ダイアログでも別々です。アプリの保存や読み込みのダイアログでもCommand+Shift+ピリオドは効きますが、これはそのダイアログの中だけの切り替えで、フォルダの窓の設定とは連動しません。ダイアログで見えているのにフォルダの窓では見えない、という食い違いはここから起きます。
隠しファイルを毎回表示するかどうか
Command+Shift+ピリオドは常時オンにもできますが、常に表示すると別の問題が出ます。ホームフォルダやプロジェクトのフォルダに .DS_Store や各種の設定ファイルが並び、目的のファイルが見つけにくくなります。作業中のフォルダほど、この影響が大きくなります。
深さの上限にも同じ性質があります。書庫のように積んだフォルダの5階層目にリポジトリが残っていると、-maxdepth 4 では見つかりません。一度だけ上限を外して全体を洗い出し、その結果を控えておく。日々の確認は上限を付けた速い形で回す、という二段構えにすると取りこぼしが減ります。
現実的なのは、既定では隠したまま、必要なときだけ切り替える運用です。キーボードの操作は1回で済み、設定を書き換えないので元に戻すのも同じ操作です。設定ファイルを触る作業が続く日だけ表示にしておき、終わったら戻す。この形が扱いやすくなります。
コマンド側にも同じ考え方が使えます。rg や fd の設定ファイルに --hidden を常時有効として書き込むこともできますが、そうすると .git の中身まで検索対象に入り、同じ文字列が何十件も並びます。都度フラグを付けるほうが、結果を読む時間は短くなります。
隠しファイルを触る作業で時間が消える場所
隠しファイルを扱う作業は、たいてい確認と編集の往復になります。フォルダの窓で場所を確かめ、ターミナルで開いて直し、結果をまた目で確かめる。表示の切り替えと窓の切り替えが、この往復ごとに挟まります。
ここで効いてくるのが、フォルダとターミナルとAIが同じ窓にあるという配置です。一覧とコマンド入力が同じ作業ディレクトリを共有していれば、隠しファイルを表示させたまま、その場でコマンドを打って結果を確かめられます。表示の切り替えが不要になるのではなく、切り替えた後の移動が消える、という効き方です。
この配置で何ができるのかはできることにまとめてあり、他の道具との違いは他のファイル管理との比較で整理しています。導入の前に費用を確かめたい場合は料金を見てから判断できます。
まず変えるべきなのは、.env や .zshrc を探すたびにキーボードの操作と検索条件を思い出している状態です。この記事にある find と rg の書き方を手元に控えておけば、探す工程はほぼ機械的に片づきます。残るのは窓の往復で、そこは道具の配置で解く部分です。
よくある質問
Command+Shift+ピリオドを押しても隠しファイルが出ないのはなぜ?
このキー操作が効くのはフォルダの窓の中だけで、デスクトップや他のアプリの保存ダイアログでは動きが変わります。また、ライブラリフォルダは別の扱いで、Optionキーを押しながら表示メニューを開くか、フォルダの表示オプションで表示する設定を入れる必要があります。
隠しファイルを検索結果に出すにはどうすればいい?
フォルダの窓で検索を始めた後、検索欄の右にあるプラスボタンで条件を足し、「その他」からシステムファイルの扱いを選んで結果に含める指定をします。この操作をしないかぎり画面の検索結果には並びません。シェルから探す場合は find が最初から隠しファイルを対象にしています。
mdfindで隠しファイルが見つからないのはなぜ?
Spotlightの索引は、ドットで始まるファイルやシステムの領域を通常は取り込まないためです。mdfind が空で返ってもファイルが無いとは判断できません。find ~ -name ".env" のようにディスクを直接たどるコマンドに切り替えると、索引の状態に関係なく答えが出ます。
.gitがフォルダではなくファイルになっているのはなぜ?
サブモジュールや git worktree として作られた場所では、.git は実体の場所を書いた1行のテキストファイルになります。そのため find -type d -name ".git" だけで探すと結果から漏れます。両方を拾いたいときは -type を付けずに -name ".git" で探し、後から種類を確かめる形にします。