Awk のTips...
lsの出力をディレクトリごとにソートする
(2001.07.11)

概要

 ディレクトリ一覧をファイルの大きさ順に整列したければ、lsの出力 をsortコマンドに食わせればいい。ディレクトリを再帰的に(サブディ レクトリ以下も)見たければ、lsに -R オプションをつければいい。

 でも、「サブディレクトリ以下を再帰的に、かつ、各ディレクトリを ファイルサイズで整列して見たい場合はどうすればいいの?」と、彼女 は言った。

やっつけ方

 lsの出力を一度Awkプログラムで受けて、切り出した必要な分のデー タをsortに流し込む、で正解でしょう。

 ただ、BSD系のlsは、少少振舞が「へん」なので、その辺に注意が必 要です。ls -lRしたとき、ディレクトリの区切りに"ディレクトリ名:" という見出しがつきますが、BSD系lsの場合、最初のディレクトリ(コ マンド行で指定されたディレクトリ?)にはこの見出しがつかないみた いです。

 ディレクトリとディレクトリの区切りでは空行が挟まりますから、そ れを手がかりにすることもできますが、ちょっといたずら心を出して、 「見出し」を手がかりにすることにします。ディレクトリは絶対パスで 指定するという約束にすれば、「行頭が'/'、行末が':'である行」を見 出しとすることができます。

コード

  1: BEGIN{
  2:     # 3番目の欄をキーにして、数値と見なして降順に整列
  3:     sort_cmd = "sort +3 -rn"
  4: }
  5: 
  6: /^\/.*:$/{
  7:     print      # ディレクトリ名(見出し)を出力
  8:     getline     # "total nnnn"の行を読み飛ばす
  9:     while($0 !~ /^$/){
 10:         print $0 | sort_cmd
 11:     }
 12: 
 13:     close(sort_cmd)
 14:     print      # 空行を挟む
 15: }
 16: 
 17: {
 18:     print      # それ以外はそのまま出力
 19: }

 いたずら心は呼び出し側にも仕掛けます。最初のディレクトリに見出 しがつかないのなら、見出しをつけて、Awkプログラムへの「入力を一 様化(正規化)」してしまえばいいわけです。これは古代ローマの格言に もかなっています(^^)

(echo "${dir}:" ; ls -lR ${dir}) | awk_program

これによって、最初のディレクトリにも見出しがついて、全体が Awkプログラムに引き渡されます。

補足

 気になっていろいろ調べてみると、ディレクトリを複数指定した場合 は見出しがつきます。「見出しがつかない」のはひとつを指定した場合 らしい。つまり上のように「見出しをつけてしまう」方法は限られた条 件のときだけ有効ということになります。が、「入力を一様化する、 正規化する」という考えが強力であり、これを実践すれば、後に控 えるプログラムがかなり簡単で楽になることは見てもらえたのではない でしょうか。

(2001.07.11)

AwkのTipsへ
参考図書へ
コンピューター言語研究所へ
トップページへ
(C) ©Copyright Noboru HIWAMATA (nulpleno). All rights reserved.