Find

用来搜索目录下的文件的模块。

用法:

require "find"

Find.find('/foo','/bar') {|f| ...}

或者

require "find"

include Find
find('/foo','/bar') {|f| ...}

下面我们就用该模块来改写ruby文档中包含的范例脚本[ruby-src:sample/trojan.rb]

#! /usr/bin/env ruby
require "find"
# 搜索允许其他人进行写操作的危险命令

for dir in ENV['PATH'].split(File::PATH_SEPARATOR)
  Find::find(dir) do |fpath|
    if File.file?(fpath) and (File.stat(fpath).mode & 022) != 0
      printf("file %s is writable from other users\n", fpath)
    end
  end
end

模块函数:

Find.find(dir[, ...]) {|file| }

就象find(1)一样,它将dir下的所有文件和目录依此传给参数file,进行块的计算。传给file时的次序是不确定的。

若您想跳过某目录下的搜索时,可以像

require 'find'

Find.find('/tmp') {|f|
  Find.prune if f == "/tmp/bar"
  ...
}

这样来使用Find.prune。在此例中,它不会搜索"/tmp/bar"下的文件和目录。若使用next来替代prune的话, 将跳过"/tmp/bar",然后继续进行下面的搜索.

Find.prune

若将目录传给Find.find方法的块时就会执行该方法, 它会在搜索过程中忽略该目录。

更新履历:

version 1.4 (ruby version 1.6.1)

不再搜索目录的符号连接。