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("./*")