mydir.rb


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('**/*')を思い出すのに手間取った。マニュアルにもあまり書いていない。こんなに便利なのに不思議ですね。アスタリスクアスタリスクとか、コメコメというキーワードはどうだろうか。とりあえずコメコメあたりが覚えやすいです。