容量の多いディレクトリを再帰的に表示するシェルスクリプト

ディスク容量が足りなくなったとき、容量の多いディレクトリなりファイルなりを圧縮したり、別の媒体に移したりしたくなる。そんなときには du -s で容量を調べ、容量の多いディレクトリを見つけたらそのディレクトリを対象に du -s で容量を調べ、ということをしたりする。え、そんなことしてるの? というツッコミがあればそれはそれで嬉しい。ともかく、よくそんなことをしているので、それを自動的にやってくれるシェルスクリプトを書いてみた。テスト全然してないから間違いがあるかもしれない。スクリプト中の head -20 も適当。

tmp1=/tmp/$$.1
tmp2=/tmp/$$.2
dir=${1:-.}
loop=${2:-10}
du -k -s $dir > $tmp1
touch $tmp2
debug=1

while [ $loop -gt 0 ] ; do
  line=`head -1 $tmp1`
  kb=${line%    *}
  entry=${line#*        }
  echo $kb $entry;
  n=`wc -l $tmp1`
  n=${n% *}
  n=$(($n-1))
  tail -$n $tmp1 > $tmp2
  if [ -d $entry ] ; then
    du -k -s $entry/* | sort -k1,1nr | head -20 >> $tmp2
  fi
  sort -k1,1nr $tmp2 > $tmp1
  loop=$(($loop-1))
done
rm $tmp1 $tmp2

第一引数に調査対象のディレクトリ (省略時はカレントディレクトリ)、第二引数に上位何件まで表示するか (省略時は 10) を指定する。

実行例

[takeyuki@sunya ~]$ bin/rdu.sh work 20