001. 単純な再帰呼び出し例

コマンド実行ディレクトリ以下にある、すべてのディレクトリをリスト表示するサンプルスクリプトです。ディレクトリを ls の結果から判定し、見つけたら echo で表示して cd で移動して、自分自身を呼び出しています。もちろん処理は遅いですが、特定の階層にある特定のファイルに対して、何らかの処理をしたい、といったときの基礎となります。

### file : findDir.tcsh

#!/usr/bin/tcsh -f

set MINE = "~/tools/findDir.tcsh"

unalias ls

unalias grep

foreach dir ( `ls -F` )

set check = `echo $dir |grep /`

if ( $status == 0 ) then

echo $dir

cd $dir

$MINE

cd ..

endif

end

ちなみにこれをRubyで行うと、自分のPCでは数十倍の処理が早いことがわかりました。以下のコードは、Ruby ver1.93で動作確認を行っています。defでメソッドを定義して、メソッドの中で自分自身を再帰呼び出ししています。

なお、以下の記述はあくまで上記 tcsh スクリプトと比較するためのコードであり、Rubyにはもっと簡単に書く方法があります。

#!/usr/bin/ruby -w

def dir_search(dir)

Dir::glob(dir){ |file|

if(File::ftype(file)=="directory")then

puts file

Dir::chdir(file)

dir_search("./*")

Dir::chdir("../")

end

}

end

dir_search("./*")