Windowsのdirは再帰でない(フォルダーに行かないと探せない)し、正規表現がDOSで展開されてしまうので不便です。一方Unixではfindという万能コマンドがありますが、これがまた使い方を思い出すのに苦労する。
テキストを読んでいたら、Dir.glob('**/*')というのでファイル名を再帰的に取得できることがわかったので、mydir.rbをつくりました。
#! /usr/bin/env ruby # mydir.rb # Take ARGV[0] as a regexp and search the filename recursively def mydir(reg) list = [] Dir.glob('**/*').each{ |filename| if reg =~ filename list[list.size] = filename end } return list end if $0 == __FILE__ if ARGV[0] != nil p mydir(/#{ARGV[0]}/) end end
で使ってみると、こんな感じ。
\>ruby mydir.rb temp
["temp.htm", "temp.jpg", "temp.rb", "temp.txt", "tempdir", "tempdir/temp.txt"]
オッケーです。
と思ったら、変な動きをするので調査中。
\>ruby mydir.rb t*mp*
["temp.htm"]
他のファイルが表示されないで、一番最初のしか見つけてくれない。
追記:了解。アスタリスクは対応するファイルがあればDOS窓のコマンドラインが展開してしまうせいですね。シングルクゥォートで囲むことで解決。プログラムも少し改良した方がいいかもしれない(ARGVすべてを対象とする)。
追記:Dir.glob('**/*')を思い出すのに手間取った。マニュアルにもあまり書いていない。こんなに便利なのに不思議ですね。アスタリスクアスタリスクとか、コメコメというキーワードはどうだろうか。とりあえずコメコメあたりが覚えやすいです。