`
hellosoft
  • 浏览: 54328 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ruby 脚本 遍历目录以及子目录

阅读更多
笔者以为rails工程 生成批量进行测试的shell脚本为例,与大家一起探讨一下。

为了能够更加快速的运行所有的测试脚本,笔者采用的方法是编写一个shell,里面写满了:
ruby test/functional/user.rb
...
之类的语句。
这样,每次运行测试的之后,只需要运行这个shell即可。
(应该还有更加简单的方法,只是没有发现,希望有知道的朋友,告知一二 : oushunbao@gmail.com. 后来发现了一个命令: rake test正好可以解决测试的问题。)

进而发现,如果有测试脚本增加,那么有将要在shell脚本中自行添加。于是乎,笔者就在想,如果可以自动生成这个脚本,岂不更好?接着,就写了下面的代码。
大致思路就是,遍历指定目录以及子目录下的所有 *.rb的文件,并且组合成 ruby ..../filename.rb的形式。然后输出。
# create runtest.rb for rails.
# e.g. :(the name of this file is createruntest.rb)
# #>ruby createruntest.rb ./test > runtest.sh
# #>chmod 777 runtest.sh
#

def getfiles(path)
  re = []
  allre = []
  Dir.foreach(path) do |f|
  	allre << f
  end
  allre.each do |f|
  	 fullfilename = path + "/" + f
  	 if f == "." or f == ".." 
    elsif File.directory?(fullfilename)
    	resub = []
		resub = getfiles(fullfilename)
		
		if resub.length > 0
			ref = {}
			ref[f] = resub
			re << ref
		end
    elsif File.exist?(fullfilename) and (f =~ /\.rb$/) # only rb file
    	re << f
    end
  end
  return re
end
def print_arr(arr,root)
	sre = ""
	arr.each {|value| 
	  if value.class == Hash 
	    value.each do |k,v|
	    	#re += "#{k} => { #{print_arr(v)} }"
	    	sre += print_arr(v,root+"/"+k)
	    end
	  else
	    #re += value
	    sre += "ruby #{root}/#{value} \n"
	  end
	  #re += ","

	}
	return sre
end

root = ARGV[0] || Dir.pwd
arr = getfiles(root)
puts print_arr(arr,root)


将以上代码保存到文件中(假设文件名为create_runtest.rb),并且将文件放置在rails的根路径下。
然后运行
#> ruby create_runtest ./test > runtest.sh
在设置权限
#> chmod 777 runtest.sh
ok
下次使用的时候,直接在rails根路径下运行 ./runtest.sh 就好了
(centos5 + ruby 1.8.6 + rails 1.2.3)

本文的中对目录中文件的解读采用了递归的方式进行,这样思路应该会更加清晰一下。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics