论坛首页 编程语言技术论坛

在给定路径中搜索符合给定模式的文件

浏览 5909 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (7)
作者 正文
   发表时间:2009-11-24  

在指定路径中搜索符合给定模式的文件,并给出关于这些文件的详细信息。实现这一目标不必依赖于任何命令行程序,只需使用Ruby内建的API。


因此,这个例子在有Ruby运行的任何平台上都能运行。

 

而且,这个例子展示了Ruby在简化脚本编程需求方面有多强大。它不是简单地模拟"find"命令,而是构建在该命令之上,因而在使用Ruby时具有很强的定制能力。

 

require 'find'
puts ""
puts "-----------------------File Search-----------------------------------"
puts ""
#请求用户提供搜索路径和匹配模式
print "Enter the search path    : "
searchpath = gets
searchpath = searchpath.chomp
puts ""
print "Enter the search pattern : "
pattern = gets
pattern = pattern.chomp
puts"----------------------------------------------------------------------"
puts "Searching in " + searchpath + " for files matching pattern " + pattern
puts"----------------------------------------------------------------------"
puts ""
Find.find(searchpath) do |path|  #使用Ruby中“Find”类的“find”方法遍历指定的搜索路径
#检查发现的文件是否为一个目录。如果是目录,并且不是“.”则递归遍历该目录
   if FileTest.directory?(path)
     if File.basename(path)[0] == ?.
       Find.prune       
     else
       next
     end
   else
     if File.fnmatch(pattern,File.basename(path))  #使用“File”类的“fnmatch”方法检查发现的文件是否符合给定的模式
       #如果文件符合模式,则输出文件的详细信息
       puts  "Filename     : " +  File.basename(path)
       s = sprintf("%o",File.stat(path).mode)
       print "Permissions  : "
       puts s
       print "Owning uid   : "
       puts File.stat(path).uid
       print "Owning gid   : "
       puts File.stat(path).uid
       print "Size (bytes) : "
       puts File.stat(path).size
       puts "---------------------------------------------------"
     end
   end
end

 

在命令行输入ruby file.rb运行该文件,然后输入搜索路径D:\ruby和匹配模式*.rb,下面是一个示例输出:

 

-----------------------File Search-----------------------------------

Enter the search path    : D:\ruby

Enter the search pattern : *.rb
----------------------------------------------------------------------
Searching in D:\ruby for files matching pattern *.rb
----------------------------------------------------------------------

Filename     : points_controller.rb
Permissions  : 100644
Owning uid   : 0
Owning gid   : 0
Size (bytes) : 12889
---------------------------------------------------
Filename     : packages_controller.rb
Permissions  : 100644
Owning uid   : 0
Owning gid   : 0
Size (bytes) : 21000
---------------------------------------------------
Filename     : orders_controller.rb
Permissions  : 100644
Owning uid   : 0
Owning gid   : 0
Size (bytes) : 2341
---------------------------------------------------
   发表时间:2009-11-24  
这样也叫强大...在find的之上做的有意义的事为零。。。
0 请登录后投票
   发表时间:2009-11-24  
囧啊,本来一行就能搞定的事情 ……
Dir.glob '*.rb'


再说 find 这个命令无论在 windows 还是 linux 还是 mac 都能用的 ……
0 请登录后投票
   发表时间:2009-11-24  
night_stalker 写道
囧啊,本来一行就能搞定的事情 ……
Dir.glob '*.rb'


再说 find 这个命令无论在 windows 还是 linux 还是 mac 都能用的 ……

又见一行命令能干啥干啥,你看清楼主的帖子了吗?你确定你这一行代码可以满足楼主的需求?

0 请登录后投票
   发表时间:2009-11-24  
ray_linn 写道
这样也叫强大...在find的之上做的有意义的事为零。。。

什么叫做DSL?
0 请登录后投票
   发表时间:2009-11-24  
night_stalker 写道
囧啊,本来一行就能搞定的事情 ……
Dir.glob '*.rb'


再说 find 这个命令无论在 windows 还是 linux 还是 mac 都能用的 ……

ruby的find还是很好用的:

require 'find'

puts "input your dir:"
dir     = gets.chomp

puts "input your pattern:"
pattern = gets.chomp
Find.find(dir) do |file|
  puts file if File.file?(file) && File.basename(file) =~/#{pattern}/
end



0 请登录后投票
   发表时间:2009-11-24  
0701 写道
night_stalker 写道
囧啊,本来一行就能搞定的事情 ……
Dir.glob '*.rb'


再说 find 这个命令无论在 windows 还是 linux 还是 mac 都能用的 ……

又见一行命令能干啥干啥,你看清楼主的帖子了吗?你确定你这一行代码可以满足楼主的需求?


一行也不是不可能的..
require 'find'
Find.find(ARGV[0]){|file| [:mode, :uid, :gid,:size].each{|m| puts File.stat(file).send(m)} if File.file?(file) && File.basename(file) =~/#{ARGV[1]}/ }

0 请登录后投票
   发表时间:2009-11-24  
ray_linn 写道
这样也叫强大...在find的之上做的有意义的事为零。。。

这位大侠,你给大家解释一下什么才叫有意义的事,不要鄙视别人的劳动成果好不好
0 请登录后投票
   发表时间:2009-11-24  
Hooopo 写道
0701 写道
night_stalker 写道
囧啊,本来一行就能搞定的事情 ……
Dir.glob '*.rb'


再说 find 这个命令无论在 windows 还是 linux 还是 mac 都能用的 ……

又见一行命令能干啥干啥,你看清楼主的帖子了吗?你确定你这一行代码可以满足楼主的需求?


一行也不是不可能的..
require 'find'
Find.find(ARGV[0]){|file| [:mode, :uid, :gid,:size].each{|m| puts File.stat(file).send(m)} if File.file?(file) && File.basename(file) =~/#{ARGV[1]}/ }


有人愿意拆开写,有人喜欢一个链条大循环,风格不同而已,况且楼主更多的是想体现出过程,多打印了几条提示语而已,too naive的抬杠
0 请登录后投票
   发表时间:2009-11-24   最后修改:2009-11-24
222xiaohuan 写道
ray_linn 写道
这样也叫强大...在find的之上做的有意义的事为零。。。

这位大侠,你给大家解释一下什么才叫有意义的事,不要鄙视别人的劳动成果好不好


ruby -e"system('dir /s *.rb')" ,这样的东西如果有意义的话,我每天有意义的东西也太多了些。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics