pcでファイルサイズが大きいものを探す|Macでの探し方

空き容量が減ってきたので、大きいファイルを探して消したい。検索欄にサイズの条件を打てば一覧が出る、という感覚で始めると、Macでは何も出ないか、あるいは本当に容量を食っている場所だけが抜け落ちた一覧が出ます。検索の当たる範囲、数字の単位、そして読めないフォルダの3つが原因で、どれが効いているかで直し方が変わります。

検索欄にサイズを打っても出てこない理由

Windowsのエクスプローラーは検索欄にサイズの条件をそのまま書けます。Finderにも同じ機能はありますが、検索欄には打ちません。検索を始めたあとに出る「+」を押し、条件の行を「ファイルサイズ」「より大きい」に変えて数値と単位を入れる場所にあります。

大きく違うのは、探している範囲です。Finderの検索が見ているのはSpotlightの索引で、ディスクの中身そのものではありません。索引を切ってあるボリュームは検索に出てきません。ディスクイメージをマウントして作業しているときは、たいてい索引が切れています。mdutil -s -a を実行するとマウント中のボリュームが状態つきで並び、Indexing disabled. と出ている行があれば、サイドバーに見えているのに検索結果に出てこない理由はそれです。

もう1つの違いは、Finderが測っているのがファイルであってフォルダではないことです。小さいファイルが2万個入ったフォルダは、合計でどれだけ容量を占めていてもサイズ検索には出ません。Macで容量が消えていくのは、まさにそういう深い階層です。

標準のストレージ画面が最初に見せてくれるもの

コマンドを打つ前に、標準の画面がすでに一覧を用意しています。アップルメニューからシステム設定を開き、一般のストレージへ進むと、カテゴリごとの内訳が出ます。その中身については次のように説明されています。

書類: お使いのMacにあるすべての書類が表示されます。サイズの大きいファイルやダウンロードを素早く表示するには、対応するボタンをクリックします。また、ファイルを並べ替えるには、ダイアログの上部付近にある「名前」「種類」「最後に開いた日」または「サイズ」をクリックします。「ファイルブラウザ」をクリックして、ファイルシステム内のさまざまなフォルダが使用しているストレージの内容やサイズを表示することもできます。

出典: support.apple.com

「書類」の中にある「大きいファイル」のボタンは、まだ何も調べていない段階では最短の入口です。「ファイルブラウザ」はフォルダごとの使用量を階層で見せる表示で、あとで出てくる du -d 1 の画面版に当たります。

この画面の限界は、カテゴリに割り当てられたものしか説明できないところにあります。「システムデータ」だけが数十ギガと表示され、押しても中身が出てこないのはそのためです。内訳が要るなら、この時点でコマンド側へ移ったほうが早く済みます。

打つ前に3つ決める

以降のコマンドはすべて、同じ3つの選択の組み合わせです。ここを外すと、10分走って何も答えない走査になります。

  • 起点。ディスクの一番上から走査するのはたいてい間違いです。大半は書き換えられないシステム側の領域で、動かせるものはホームフォルダの中の1つか2つの場所に集まっています
  • しきい値。低すぎると答えが埋もれます。仕事に使っているMacで100MB以上を全部出せば数百行になります。まず1GBで区切り、短ければ下げるほうが読む時間は短くなります
  • 単位。これが最もつまずく場所で、既定の単位が誰も想像しない形になっています

もう1つ、最初の1回だけ決めればよいことがあります。巨大な1個を探しているのか、静かに溜まったフォルダを探しているのかです。この2つは使うコマンドが違い、間違えると「何も見つからないのに容量は減らない」という状態になります。

duの数字はメガバイトではない

du はオプションを付けないと512バイトのブロック単位で答えます。100KBのファイルが1つ入ったフォルダは 200 と返ります。この数字は間違っていませんし、キロバイトでもありません。キロバイトとして読むと、見積もりが倍ずれます。

直すのは1文字のオプションです。-k でキロバイト、-m でメガバイト、-h は行ごとに読みやすい単位を選びます。手で打って読むなら -h で、これは sort -h と組み合わせられます。単位が混ざった行を正しい順に並べてくれるので、du -h -d 1 ~/Documents | sort -h と書けば、いちばん重いフォルダが出力の最後、つまり目の行く位置に来ます。

あと2つ、付ける価値のあるオプションがあります。-d 1 は1階層下までに報告を絞ります。「どのフォルダか」を知りたいだけのときに、木の全ディレクトリが並ぶのを防げます。-x は同じファイルシステムの中に走査を留めます。マウント中のディスクイメージや外付けへ迷い込んで何分も費やすのを避けられます。

走査は見た目より時間がかかります。実測した1台では du -x -d 1 -h ~/Library の結果が返るまで2分以上かかりました。待った甲斐のある答えで、Library全体716GBのうち、Application Supportが360GB、Containersが142GB、Cachesが85GBでした。この3つはどれもサイズ検索には出てきません。ファイルではないからです。

findで「大きい1個」を出す

もう一方の問いに答えるのが find です。場所を問わず、ある大きさを超えるファイルを個別に並べます。

書き方の罠は接尾辞です。find ~ -type f -size +1G はギガバイト、+500M はメガバイトですが、単位を付けずに -size +500 と書くと512バイトのブロックが500個、つまり250KBという意味になります。コマンドは動き、数千行を返し、条件が無視されたように見えます。

-type f を足すと通常のファイルだけに絞られ、ディレクトリやシンボリックリンクが一覧を膨らませません。-x の意味は du と同じです。結果を -exec ls -lh {} + で受ければ、パスの羅列がサイズ付きの一覧に変わります。たいていはそちらが見たかったものです。

権限のエラーは早めに黙らせておくほうが読めます。ホームフォルダから走査すれば、入れないディレクトリごとに1行出ます。末尾に 2>/dev/null を付ければ静かになりますが、その中身については次の節に但し書きがあります。

知りたいこと コマンド 返るもの
どのフォルダが重いか du -x -h -d 1 ~/Documents | sort -h フォルダごとの合計
巨大な1個はどれか find ~ -x -type f -size +1G ファイル1件につき1行
正確なバイト数 stat -f '%z' name.mov 実際のバイト数
索引済みの大きいファイル mdfind 'kMDItemFSSize > 1073741824' Spotlightの索引からのパス
そのボリュームは索引済みか mdutil -s -a ボリュームごとの状態

数えさせてもらえないフォルダがある

どう書いても Operation not permitted が返るディレクトリがあります。最近のmacOSで du -sh ~/Library/Mail を実行すると、まさにそれが出ます。不具合でもなく、sudoで解決する話でもありません。メール、メッセージ、Safariのデータなどはプライバシーの仕組みで保護されていて、読むにはそのプロセスがフルディスクアクセスを持っている必要があります。

これは足し算に効きます。ホームフォルダの走査が200GBと答え、ストレージの画面が300GBと言っているとき、その差は隠しファイルとは限りません。一部は、走査が断られたフォルダの分です。システム設定のプライバシーとセキュリティでターミナルにフルディスクアクセスを与えると、エラーが静かになるのではなく答えが変わります。

Spotlight側の穴は種類が違います。mdfind 'kMDItemFSSize > 1073741824' が速いのは、ファイルサイズが索引にすでに入っているからです。find が数分かかる場面で1秒ほどで返ります。その代わり、索引が切れているボリュームの中身と、名前が .noindex で終わるディレクトリの中身を、何も言わずに落とします。後者は開発用の道具がキャッシュ置き場によく使う書き方です。

消す前に、もう1つ数字の但し書きがあります。du が答えるのはファイルの論理的な大きさです。クローンで作った2つのコピーが実体を共有していても、2つ分として数えます。10MBのファイルを cp -c で複製すると、du は20MBと言い、ディスクの空きはほとんど動きません。片方を消しても空きは増えません。

消す候補を、消す前に確かめる

画面にパスが1行出た時点では、まだ判断がついていません。消してよいものと、後で困るものを分ける確認が3つあり、どれも1秒かかりません。

1つ目は正確な大きさです。読みやすい表示は丸めているので、実際の数字とはずれます。大きな動画に mdls -name kMDItemFSSize を当てると 13592977182 のような値が返り、丸めに隠れる分がありません。索引を通さずに同じ答えを得たいなら stat -f '%z' です。

2つ目は、最後にいつ触られたかです。ls -lu は更新日時ではなく最後に読まれた日時を出します。1年前に書かれて昨日読まれたファイルと、置かれてから一度も開かれていないファイルを区別できます。Spotlight側の mdls -name kMDItemLastUsedDate も試す価値はありますが、(null) が返ることがよくあります。通常のアプリ経由で開かれたときにしか記録されない属性だからです。

3つ目は、いま誰かが開いていないかです。lsof に続けてパスを書くと、使われていなければ何も出ず、使われていればそのプロセスが並びます。動作中のアプリが書き込み続けている大きなファイルは、消してはいけないものの筆頭で、この1秒の確認がそれを拾います。

拡張属性も同じ方向の手がかりになります。xattr にパスを渡すと、付いているものが並びます。com.apple.maclcom.apple.provenance が出てくるファイルは、サンドボックスのファイルダイアログを通って来たものです。自分で置いたのではなく、アプリが置いた可能性が高いことを示します。

探した結果を次に渡すところで止まる

走査が終わり、画面にパスが1行残ります。作業はここから始まります。中身を見て、消してよいか判断し、何かが依存していないか確かめて、ようやく消す。この流れは毎回、窓をまたぎます。パスはターミナルから出てきて、中身を見るにはFinderかアプリが要り、判断が済んだらまたターミナルへ戻って同じパスを打ち直します。

この往復を減らすのはコマンドの問題ではなく、画面の配置の問題です。フォルダとターミナルとAIが同じ窓にある形なら、一覧とプロンプトが同じディレクトリを指すので、コマンドが見つけたパスが隣の一覧ですでに選ばれている状態になります。その組み合わせで何ができるかはできることに整理してあります。同じ問題の一部を解いている2画面型のファイル管理やFinderの代替との違いは、優劣を付けずに並べた他のファイル管理との比較で確かめられます。導入の条件は料金にまとめてあります。

よくある質問

Finderのサイズ検索で、容量を食っているフォルダが出てこないのはなぜですか?

サイズ検索が照合しているのはファイルであって、フォルダではないためです。小さいファイルが大量に入ったフォルダには照合できるサイズの属性が無く、合計がどれだけ大きくても一覧に出ません。親フォルダに対して du -x -h -d 1 を当てて、フォルダごとの合計で見てください。

duにオプションを付けないと、どの単位で出ますか?

512バイトのブロック単位です。100KBのファイルが1つ入ったフォルダは 200 と返ります。読みやすくするなら -h、キロバイトなら -k、メガバイトなら -m を付けます。-h の出力は sort -h に渡すと正しい順に並びます。

duで「Operation not permitted」と出るフォルダがあります。どうすればよいですか?

ファイルの権限ではなく、プライバシーの仕組みで保護されているフォルダです。メールが最初に当たる例です。システム設定のプライバシーとセキュリティでターミナルにフルディスクアクセスを与えると読めるようになります。与えるまでは、そのフォルダの分だけ合計が少なく出ています。

mdfindはfindより速いと聞きましたが、注意点はありますか?

サイズがSpotlightの索引にすでに入っているため、ディスクを読み直す find よりかなり速く返ります。注意点は範囲で、索引を切ってあるボリュームからは何も返らず、名前が .noindex で終わるディレクトリの中身も対象外です。索引の状態は mdutil -s -a で確かめられます。

記事一覧へ戻る