読者です 読者をやめる 読者になる 読者になる

iノード(inode)の使用量をディレクトリごとに表示するワンライナー

ファイルのメタ情報を格納するiノード(inode)というものがあるがこれが枯渇するとそれ以上ファイルが作れなくなってしまう。
iノードの数が少なくなってきた時どこが主にiノードを食っているのか確認したいことがあると思う。
が、特定ディレクトリのiノードを表示するコマンドは残念ながらない。
しかしiノードはファイル/ディレクトリに対して(ハードリンクをしない限り)ユニークに割り当てられるということを用いて大体の数を算出することができる。
以下がそのワンライナー。カレントディレクトリにあるディレクトリのiノードを表示してくれる。
使い方としてはdf -iでiノードが減少しているディスクをさがしそこのディレクトリに移動、肥大化しているディレクトリを調べる。
その肥大化しているディレクトリに移動...を繰り返して範囲を適切に狭めていく。

    for dir in `ll|grep ^d|grep -v "\./"|awk '{print $9}'`; do echo  `find ./$dir -true|wc -l` `pwd`/$dir; done | sort -nr

していることとしては

    ll|grep ^d|grep -v "\./"|awk '{print $9}'

でllの出力のうち先頭のパーミッションを解析してディレクトリのものをフィルタし、awkでディレクトリ名を取り出している。
ちなみにllのフォーマットがディストリビューションによって異なっていたり、そもそもなかったりするのでgrepawkの部分注意。
ls -lを使ったほうが無難かもしれない。

さてその結果の各行ごとに回しながら取り出して

    for dir in `ll|grep ^d|grep -v "\./"|awk '{print $9}'`

でdirに束縛する。

そして

    do echo `find ./$dir -true|wc -l` `pwd`/$dir

で./dir以下にあるファイルすべてを列挙しwc -lでその数を数えている。
あとは見やすいようにpwdとdirでそのディレクトリを表示している。
これだけでもいいがファイル数順(=iノードを消費している順)にならんだほうがみやすいのでsort -nrで並べ替える。