Ruby/Programming/FileFinder

Last-modified: 2008-02-17 (日) 00:16:50

ディレクトリツリーからファイルを探す(Unixのfind -name -print相当)

2008.02.09 初版
Windows(DOSコマンド)にはUnixのfindに相当するユーティリティはない。GnuWin32(Cygwinとは別のWin32ポート)にはfindutilsとしてあるが持ってき損なった。

取ってくればいいだけの話だけど、ないならちょいと作ってやれということで挑戦。GnuWin32はなくともRubyはある、という状況は多かろうし。昔Cでシステムコールなんかを呼んで同様のものを書いたことがあり、要領は判っている。始点のディレクトリからサブディレクトリを再帰的に降りていって……

でも、Rubyには既にfindというライブラリがあるのでした。何もすることがない。

まずは「指定されたファイルのパスを印字する」版。

require 'find'
def usage
  print "Usage: #{File.basename($0)} <dir> [RE...]\n"
end
if ARGV.size == 0 then
  usage
  exit 0
end
startdir = ARGV[0]
ARGV.shift
Find.find(startdir){|f|
  if ARGV.size == 0 then
    printf "%s\n", f
  end
  ARGV.each{|n|
    if Regexp.new(n) =~ f then
      printf "%s\n", f
    end
  }
}

注意

  • ファイル名として与えるパターンが正規表現の場合、単引用符で括る必要がある。そうでないとこのプログラムに渡る前にワイルドカードが展開されてしまう。二重引用符ではダメ。rubyが展開しておるのだな。

ここを参照しているページ

#related: relatedプラグインは廃止されました。