ファイル サイズ 大きい 探す|検索条件の作り方で結果が変わる
ファイル サイズ 大きい 探すという操作は、どの道具に聞くかで3通りの答えが返ってきます。Finderが返す一覧、mdfindが返す一覧、findが返す一覧はそれぞれ違い、しかもどれも壊れていません。測っている対象が違い、見に行く場所が違い、そもそも「1件」の数え方が違うからです。
ここで扱うのは「どのフォルダが重いか」ではなく、検索条件そのものの作り方です。条件が正しいかどうかが、手を付ける一覧が探したかった一覧かどうかを決めます。
検索条件に「サイズ」は最初から入っていない
Finderの検索フィールドに文字を打つと、名前と中身が検索されます。サイズでは検索されませんし、サイズの欄はこちらが追加するまで画面のどこにも出てきません。
手順は決まっています。Finderウインドウを開いてCommand+F、検索フィールドの下にある追加ボタンを押して条件を1つ足します。最初のポップアップメニューには、よく使う属性が短い一覧で出ます。サイズはそこに無いことがあります。一覧のいちばん下の「その他」を選ぶと全属性の一覧が開き、そこでサイズを選べます。同じ画面でお気に入りに入れておくと、次からは短い一覧に出るようになります。
検索の範囲を決める設定がもう2つあります。1つは検索フィールドの下にある範囲の切り替えで、「このMac」と現在のフォルダを行き来します。この初期値は、検索を始めた入口によって同じではありません。ほとんど何も返ってこない検索は、たいてい機械全体ではなくフォルダに絞られた検索です。
もう1つは単位です。サイズの条件は数値と単位を選ぶ形になっていて、ギガバイトは1,024メガバイトではなく1,000メガバイトとして扱われます。「1GBより大きい」は「1,000,000,000バイトより大きい」という条件です。1個のファイルでは小さな差ですが、しきい値の近くにファイルが集まっていると、どちらの流儀を想定したかで一覧の長さが変わります。
Spotlightは「1件」の数え方が違う
Spotlightが索引に入れているのは項目であって、その項目はファイルシステムから見たファイルとは限りません。
アプリケーションのバンドル、いくつかの書類形式、写真のライブラリは、実体はディレクトリでありながら、システムが1つのものとして見せています。Spotlightはそれらに合計のサイズを報告します。500MBを超える項目を探す条件は、動画ファイルと並んでアプリケーションを返します。これは意図によって、まさに正解でもあり、まったくの見当違いでもあります。
同じ索引をコマンドから引くと、この振る舞いが目に見えます。
mdfind -onlyin /Applications 'kMDItemFSSize > 500000000'
これはアプリケーションの名前を返します。同じ条件を動画のフォルダに向けると、個々のファイルを返します。同じ条件、同じ索引で、種類の違う結果が出て、出力の側にはその区別が現れません。
索引には穴もあります。Spotlightのプライバシーの一覧に入れたボリュームは何も返しません。索引作成が終わっていない外付けドライブは、途中までの結果を返します。先頭がピリオドのディレクトリやシステムの大部分は、設計として索引の外にあります。バージョン管理のオブジェクト置き場やパッケージのキャッシュの中に大きなファイルがあっても、Spotlight経由の検索では永久に出てきません。
これはSpotlightが不適切だという話ではありません。ユーザの書類を探すには正しい道具で、ディスク全体を棚卸しするには向かない道具だ、という話です。厄介なのは、向いていないときにエラーではなく沈黙が返ることです。
findはバイトではなくブロックで数える
findは索引を読みません。ディレクトリの木をたどって、1件ずつファイルシステムに問い合わせます。だからSpotlightが見ない場所も見えます。先頭がピリオドのディレクトリも、索引が無いボリュームも対象です。
落とし穴は単位です。接尾辞を付けずに-sizeへ数値を渡すと、その数値は512バイトのブロックの個数として数えられ、しかも切り上げられます。
確かめるのは簡単です。ちょうど1,000バイトのファイルを作ります。512バイトのブロックを2つ占めるので、find . -size 1では一致せず、find . -size -2でも一致しません。一致するのはfind . -size 2だけです。バイトのつもりで書いた条件は、小さいファイルを黙って除外し、しきい値の近くで予想と違う動きをします。
対処は、常に接尾辞を付けることです。
find ~ -type f -size +500M
find ~ -type f -size +1G
MやGを付ければ、数字は見た目どおりの意味になります。なおfindはバンドルの中にも入っていくので、アプリケーションのフォルダを対象にすると、アプリそのものではなく中のファイルが並びます。同じフォルダに対してSpotlightがやることとは逆です。
画面に出るサイズと、ディスクが使っている量は桁が違うことがある
ファイルは、占めていないサイズを申告できます。スパースファイルは、データが入っているブロックだけを記録し、残りの長さは帳簿上の数字として持ちます。
差は微妙な量ではありません。1,000,000,000バイト目に1バイトだけ書いたスパースファイルは、ls -lでもFinderでも1,000,000,001バイトと表示されます。同じファイルについてduが報告するのは4KBです。サイズ検索はこれを見つけます。消して戻る容量は4KBです。
dd if=/dev/zero of=sparse.bin bs=1 count=1 seek=1000000000
ls -l sparse.bin
du -h sparse.bin
仮想マシンのディスク、データベースのファイル、一部のディスクイメージは、通常の使い方でスパースになります。APFSのクローンでは逆向きの食い違いが起きます。2つのファイルがそれぞれ満額のサイズを申告しながら、データは共有されています。
実務上の規則は単純です。サイズ検索は「申告された長さ」についての質問に答え、duは「実際に占めている量」についての質問に答えます。目的が整理ではなく空き容量なら、サイズ検索で候補を出し、その候補をduで確かめてから決めます。
| 道具 | 渡す単位 | 何を測るか | 見えない範囲 |
|---|---|---|---|
| Finderの検索 | GBは1,000MB | 申告された長さ。バンドルは1件 | Spotlightの索引の外すべて |
mdfind |
バイト | 申告された長さ。バンドルは1件 | プライバシー設定、未索引、ピリオド始まり |
find -size |
既定は512バイトのブロック | 申告された長さ。バンドルに入る | 死角は無いが全体では遅い |
du |
占有ブロック | 実際に使っている量。クローンは満額 | 起点のディレクトリが要る |
ls -l |
バイト | 1件の申告された長さ | 一度に1件だけ |
サイズだけを条件にすると、見当違いの一覧が出る
サイズで並べ替えた一覧は、聞いた質問には答えていますが、聞きたかった質問には答えていません。作業中の機械でいちばん大きいファイルは、たいていいま作業しているファイルです。サイズだけの条件は、触ってはいけないものを先頭に並べ、2つ前の案件の書き出しを一覧のずっと下に埋めます。
そこに時間の条件を足すと、質問の形が変わります。Finderの検索条件は組み合わせられるので、「最後に開いた日」の条件をもう1つ足せば、「大きくて、しばらく触っていない」という本来の質問に近づきます。
コマンド側でも同じ組み合わせができます。ただし、どの日時を読んでいるかには注意が必要です。
find ~ -type f -size +200M -atime +365
find ~ -type f -size +200M -mtime +365
上は過去1年アクセスされていないファイル、下は過去1年変更されていないファイルに一致します。この2つは入れ替えられません。アクセス日時はバックアップ、索引の作成、ウイルス対策の読み取りでも更新されるため、機械によっては「全部が昨日触られた」と報告します。変更日時のほうが安定していますが、読むだけで書かないファイルを取りこぼします。
Spotlightにはこの用途の属性が別にあり、どちらより当てになります。ファイルシステムの読み取りではなく、アプリからの使用を記録しているためです。
mdfind 'kMDItemFSSize > 200000000 && kMDItemLastUsedDate < $time.now(-31536000)'
これは200MBを超えていて、最後に使われた記録が1年より古い項目を返します。索引の制約はそのまま引き継ぐので、ディスク全体ではなく書類を対象にした条件として使います。
足す価値のある3つ目の条件は種類です。ムービーだけ、ディスクイメージだけに絞ると、どの行も同じ基準で判断できる一覧になります。40件を見直すとき、種類が混ざった40件は1行ごとに考え直す必要がありますが、種類がそろっていれば同じ判断を40回繰り返すだけで済みます。
条件は作り直さず、保存する
一度作って捨てた検索条件は、次のときにまた雑に作り直されます。Finderはそれを保存できます。
条件を組んだ状態で「保存」を押すと、開くたびに条件を実行し直すスマートフォルダになります。
Mac上で条件を満たすファイルを追加、変更、または削除すると、スマートフォルダ内のファイルのリストが自動的にアップデートされます。 出典: support.apple.com
持っておく価値があるのは2つです。機械全体で1GBを超えるファイル。そして、200MBを超えていて過去1年開いていないファイル。役に立つのは後者のほうです。サイズだけでは、それがまだ必要かどうかは何も分からないからです。
保存の段でつまずく制約が1つあります。フォルダの名前には使えない文字があり、コロンはその1つです。時刻や比率を名前に入れたスマートフォルダは弾かれます。エラーの文面は問題があることは伝えますが、どの文字かは書きません。
コマンド側でこれに相当するのは、シェルの関数や別名です。読める形で残るという利点があり、サイドバーに並ばないので目に入らないという欠点があります。
一覧が出たあとの一手で止まる
条件を作るところまでが簡単な半分です。そのあとに残るのは、結果を1件ずつ開き、判断し、移動するか、圧縮するか、消すかを決める作業で、サイズの棚卸しはたいていここで止まります。
Finderの検索結果は、その場で整理できません。あの画面はフォルダではなく、一致した項目を並べた眺めだからです。並べ替えは効きますが、ファイル自体はディスク中に散らばっていて、20件に手を付けるということは、結果の画面と各ファイルの実際の置き場所を20往復するということです。
findやmdfindの結果はパスの一覧です。まとめて処理するには正しい形で、中身を見るには向かない形です。4GBのファイルがまだ必要かどうかを決めるには、たいてい開いてみる必要がありますが、ターミナルの中のパスは開きません。
この分断がサイズ棚卸しの本当の費用です。条件を作る場所と、判断する場所と、手を動かす場所が別々にあります。
フォルダとターミナルとAIが同じ窓にある状態なら、findの結果をその場のフォルダ表示として受け取り、中身を見て、同じ画面で移動や削除まで進めます。3つのアプリを行き来していた輪が閉じます。どの作業が1つの画面に収まるかはできることに、他の道具がこの分担をどう扱っているかは他のファイル管理との比較にまとめてあります。表示の言語をそろえたい場合は対応言語も参考になります。
最初に変えるべきなのは検索の腕前ではありません。条件を1回だけ丁寧に作って保存し、出てきた数字を答えではなく候補として扱うことです。
よくある質問
Finderでサイズを指定して検索しても何も出ないのはなぜですか?
よくある原因は2つです。検索の範囲が「このMac」ではなく現在のフォルダになっていることがあり、切り替えのボタンは検索フィールドのすぐ下にあります。もう1つは、対象がSpotlightの索引の外にある場合です。先頭がピリオドのディレクトリや、プライバシーの一覧に入れたボリュームは索引に入りません。
findで-size 1と書いたのに1,000バイトのファイルが出ないのはなぜですか?
接尾辞を付けないと、数値は512バイトのブロックの個数として数えられ、切り上げられるためです。1,000バイトのファイルはブロック2つ分なので、一致するのは-size 2です。バイトならc、メガバイトならM、ギガバイトならGを付ければ、数字は見た目どおりの意味になります。
大きいファイルを消したのに空きがほとんど増えないのはなぜですか?
そのファイルがスパースである可能性が高いです。実際に持っているブロックよりずっと大きな長さを申告する形式で、仮想マシンのディスクや一部のデータベースファイルがこの形になります。duは実際に占めている量を返すので、消す前にduで確かめると、実際に戻る容量が分かります。
アプリケーションは1件として数えられますか?
道具によって違います。SpotlightとFinderはバンドルを1つの項目として扱い、合計サイズを報告するので、大きい項目の検索にはアプリケーションが並びます。findはバンドルの中に入り、中の個々のファイルを報告します。同じフォルダでも、どちらで検索したかで一覧の中身が大きく変わります。