このブログは、アフィリエイトプログラム(Amazonアソシエイト含む)やGoogleアドセンスを利用しています。

duコマンドで特定のディレクトリを除外してmacのストレージ使用量を確認する方法

ターミナルで du コマンドを使うと、ディレクトリごとのストレージ使用量を確認できます。
ただし、クラウドストレージの同期フォルダや大量のファイルを含むフォルダが混ざると、結果が見づらくなることがあります。
この記事では、特定のディレクトリを除外して出力をスッキリさせる方法を紹介します。

前提:macの du はLinuxと違う

macOS の du は BSD 系のため、Linux でよく紹介される --exclude オプションは使えません。 また、-d(階層制限)は BSD du にも存在しますが、Linux の --max-depth と仕様が微妙に異なります。 この記事では macOS 標準の du で動く方法を紹介します。

基本のコマンドおさらい

まず、ホームディレクトリ以下を2階層まで表示する基本コマンドです。

du -h -d 2 "$HOME" | sort -hr
  • -h : KB・MB・GBなど人間が読みやすい単位で表示
  • -d 2 : 最大2階層まで掘り下げる(-d 0-s と同等でディレクトリ合計のみ表示)
  • sort -hr : サイズの大きい順に並び替え

権限エラーが出る場合は先頭に sudo を付けてください。

特定のディレクトリを除外するコマンド

grep -Ev を追加することで、出力から特定のディレクトリを除外できます。

du -h -d 2 "$HOME" \
  | grep -Ev '(^|/)(Downloads|pCloud Drive)(/|$)' \
  | sort -hr

このコマンドでは DownloadspCloud Drive を除外しています。

コマンドの解説

grep -Ev は「拡張正規表現でマッチした行を除外する」オプションです。
パターンの意味を分解すると以下のとおりです。

  • -E : 拡張正規表現を使用(|() をそのまま書ける)
  • -v : マッチする行を除外(逆マッチ)
  • (^|/) : ディレクトリ名の直前が行頭またはスラッシュ
  • (Downloads|pCloud Drive) : 除外したいディレクトリ名(| でOR条件)
  • (/|$) : ディレクトリ名の直後がスラッシュまたは行末

(^|/)(/|$) でディレクトリ名の境界を確認しているため、Downloads-backup のような部分一致は除外されません。

除外するディレクトリをカスタマイズする

除外したいディレクトリ名は Downloads|pCloud Drive の部分を書き換えるだけです。
| で区切ることで複数指定できます。

# 例:DropboxとDocumentsを除外する場合
du -h -d 2 "$HOME" \
  | grep -Ev '(^|/)(Dropbox|Documents)(/|$)' \
  | sort -hr

除外するディレクトリが1つだけの場合は、シンプルに書くこともできます。

du -h -d 2 "$HOME" | grep -v 'Downloads' | sort -hr

ただし、この省略形は Downloads-backup のような名前のフォルダも除外されてしまいます。
正確に除外したい場合は、上のパターンを使ってください。

発展編:find -prune で除外する

grep でフィルタする代わりに、find -prune で最初からそのディレクトリをたどらない方法もあります。

find "$HOME" \
 -maxdepth 2 \
  \( -name 'Downloads' -o -name 'pCloud Drive' -o -name 'Library' \) -prune -o \
  -type d -print \
| xargs du -h -s \
| sort -hr
  • \( … \) : 条件をグループ化
  • -name 'Downloads' -o -name 'pCloud Drive' : -o はOR条件。複数のディレクトリ名を並べて指定できる
  • -prune : グループにマッチしたディレクトリをそもそも走査しない
  • -o -type d -print : pruneされなかったディレクトリを出力(-prune の後ろの -o は「それ以外は」という意味)
  • xargs du -h -s : 各ディレクトリの合計サイズを表示

grep でのフィルタと違い、除外ディレクトリの中身をそもそも読まないため、対象が大きいフォルダの場合はこちらの方が高速です。

まとめ

grep -Ev を使えば、シンプルなパターンで特定のディレクトリを安全に除外できます。
除外対象が大きく、速度を重視する場合は find -prune との組み合わせも検討してみてください。