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

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

阅读更多

在指定路径中搜索符合给定模式的文件,并给出关于这些文件的详细信息。实现这一目标不必依赖于任何命令行程序,只需使用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
---------------------------------------------------
分享到:
评论
22 楼 lookdd1 2009-11-27  
支持 ray_linn , 技术人员不用怕被抨击,没有最好,只有更好!
21 楼 Hooopo 2009-11-26  
night_stalker 写道
囧啊,本来一行就能搞定的事情 ……
Dir.glob '*.rb'


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

貌似rake自带的FileList和Dir.glob是一样的。一个简单的rake:

namespace :file do
  desc "rake search file demo"
  task :search do
    Dir.chdir ENV["dir"]||"."
    FileList[ENV["pattern"]].each do |file|
      p file
    end
  end
end

执行:
C:\workspace\eldorado>rake file:search pattern=**/*.rb

结果:
"db/migrate/066_remove_sessions_table.rb"
"db/migrate/067_add_timezone_to_setting.rb"
"db/migrate/068_move_bans_to_users_table.rb"
"db/migrate/069_create_messages.rb"
"db/migrate/070_add_indexed_to_messages.rb"
"db/migrate/071_add_private_to_settings.rb"
"db/migrate/072_add_login_message_to_settings.rb"
"db/migrate/073_removing_privacy_from_individual_models.rb"
"db/migrate/074_all_nil_users_online_at.rb"
"db/migrate/075_add_chatting_at_to_users.rb"
"db/migrate/076_add_indexes_for_chat.rb"
"db/migrate/077_add_logged_out_at_to_users.rb"
"db/migrate/078_fix_indexes.rb"
"db/migrate/079_add_logged_out_for_all_users.rb"
"db/migrate/080_fix_user_indexes.rb"
"db/migrate/081_add_sticky_index_to_topics.rb"
"db/migrate/082_change_to_logged_out_for_users.rb"
"db/migrate/083_remove_user_index_on_logged_out_at.rb"
"db/migrate/20080526190223_remove_limit_on_users_bio.rb"
"db/migrate/20080603023415_use_rails_new_default_time_zones.rb"
"db/migrate/20080603035014_move_time_zone_default_to_setting_model.rb"
"db/migrate/20080603230322_use_rails_new_default_time_zones_for_settings_too.rb"
"db/migrate/20080712034609_create_articles.rb"
"db/migrate/20080712230439_add_articles_count_to_users.rb"
"db/migrate/20080725023025_create_comments.rb"
"db/migrate/20080725023050_add_comments_counter_cache_to_articles.rb"
"db/migrate/20080727205027_add_admin_only_create_setting.rb"
"db/migrate/20080927025905_create_viewings.rb"
"db/migrate/20081002051832_add_all_viewed_at_to_users.rb"
"db/migrate/20081015052225_add_index_to_viewings.rb"
"db/migrate/20090627234146_attachment_fu_to_paperclip_part_one.rb"
"db/migrate/20090701005540_attachment_fu_to_paperclip_part_two.rb"
"db/migrate/20090702030411_reset_current_theme.rb"
"db/schema.rb"
"lib/authentication_system.rb"
"lib/exception_handler.rb"
"lib/migrator.rb"
"lib/paperclip_support.rb"
"public/dispatch.rb"
"test/blueprints.rb"
"test/functional/articles_controller_test.rb"
"test/functional/avatars_controller_test.rb"
"test/functional/categories_controller_test.rb"
"test/functional/comments_controller_test.rb"
"test/functional/events_controller_test.rb"
"test/functional/forums_controller_test.rb"
"test/functional/headers_controller_test.rb"
"test/functional/home_controller_test.rb"
"test/functional/messages_controller_test.rb"
"test/functional/posts_controller_test.rb"
"test/functional/ranks_controller_test.rb"
"test/functional/search_controller_test.rb"
"test/functional/settings_controller_test.rb"
"test/functional/subscriptions_controller_test.rb"
"test/functional/themes_controller_test.rb"
"test/functional/topics_controller_test.rb"
"test/functional/uploads_controller_test.rb"
"test/functional/users_controller_test.rb"
"test/integration/admin_only_create_test.rb"
"test/integration/exception_handler_test.rb"
"test/integration/fixture_validation_test.rb"
"test/integration/home_page_chat_test.rb"
"test/remote/uploads_controller_test.rb"
"test/remote/upload_test.rb"
"test/test_helper.rb"
"test/unit/article_test.rb"
"test/unit/avatar_test.rb"
"test/unit/category_test.rb"
"test/unit/comment_test.rb"
"test/unit/event_test.rb"
"test/unit/forum_test.rb"
"test/unit/header_test.rb"
...

20 楼 poshboytl 2009-11-24  
ray_linn 写道
poshboytl 写道
ray_linn 写道
222xiaohuan 写道
那你应该加上对你来说没有意义,对于我们这些水平低的人很多东西还是很有意义的。


嘿嘿,你不知道robbin一向风格是不欢迎新手么



你就是自认为自己要不完了... 

robbin文风的确犀利... 但是别人说的有道理, 有价值...

我不是不喜欢抨击.... 相反我很喜欢有意义有价值的抨击....

很多东西要辩才能有更好的解决方案....

你看你的抨击有价值吗???


笑眯眯走过~


不送, 希望你永远不要回来了....
19 楼 ray_linn 2009-11-24  
poshboytl 写道
ray_linn 写道
222xiaohuan 写道
那你应该加上对你来说没有意义,对于我们这些水平低的人很多东西还是很有意义的。


嘿嘿,你不知道robbin一向风格是不欢迎新手么



你就是自认为自己要不完了... 

robbin文风的确犀利... 但是别人说的有道理, 有价值...

我不是不喜欢抨击.... 相反我很喜欢有意义有价值的抨击....

很多东西要辩才能有更好的解决方案....

你看你的抨击有价值吗???


笑眯眯走过~
18 楼 poshboytl 2009-11-24  
rubynroll 写道
就题目给定的需求,个人觉得还是直接用find命令最方便,配合管道与其它程序如sed配合功能也可以很强大。不过在程序中Find还是很好用。



如果可以用find其实我也倾向于用find....

但是我认为楼主就是要提供 一个不依赖于命令行的纯ruby的解决方案....



17 楼 poshboytl 2009-11-24  
ray_linn 写道
222xiaohuan 写道
那你应该加上对你来说没有意义,对于我们这些水平低的人很多东西还是很有意义的。


嘿嘿,你不知道robbin一向风格是不欢迎新手么



你就是自认为自己要不完了... 

robbin文风的确犀利... 但是别人说的有道理, 有价值...

我不是不喜欢抨击.... 相反我很喜欢有意义有价值的抨击....

很多东西要辩才能有更好的解决方案....

你看你的抨击有价值吗???
16 楼 rubynroll 2009-11-24  
就题目给定的需求,个人觉得还是直接用find命令最方便,配合管道与其它程序如sed配合功能也可以很强大。不过在程序中Find还是很好用。
15 楼 222xiaohuan 2009-11-24  
ray_linn 写道
222xiaohuan 写道
那你应该加上对你来说没有意义,对于我们这些水平低的人很多东西还是很有意义的。


嘿嘿,你不知道robbin一向风格是不欢迎新手么

那你又老到哪里去了啊,我为什么要迎合他的喜好,他难道就是天生老手吗?真是搞笑
14 楼 ray_linn 2009-11-24  
222xiaohuan 写道
那你应该加上对你来说没有意义,对于我们这些水平低的人很多东西还是很有意义的。


嘿嘿,你不知道robbin一向风格是不欢迎新手么
13 楼 poshboytl 2009-11-24  
ray_linn 写道
Hooopo 写道
我有说楼主的代码不对,不好了吗?
我只是提供another way.....怎么这也too native了?





很aggressive的人是我,要抨击的还是这个地方

# 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  


My god,就是在C语言里,printf也不是这么用的.

#{..}这个总可以用吧,换行就\n就可以了,这位大侠好么,切着print和puts来回折腾,这样是否体现ruby很强大 ?


实在看不下去了....
有些人在javaeye里 除了抨击这个就是洗刷那个...
而且从来都抨击的一点价值都没有....
你那说的 都哪儿跟哪儿啊??? 而且态度恶劣.. 一副要不完的样子....

javaeye里面这样的人还不少....   哎....这样会毁了javaeye社区的....


12 楼 222xiaohuan 2009-11-24  
ray_linn 写道
222xiaohuan 写道
ray_linn 写道
这样也叫强大...在find的之上做的有意义的事为零。。。

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


ruby -e"system('dir /s *.rb')" ,这样的东西如果有意义的话,我每天有意义的东西也太多了些。

那你应该加上对你来说没有意义,对于我们这些水平低的人很多东西还是很有意义的。
11 楼 ray_linn 2009-11-24  
Hooopo 写道
我有说楼主的代码不对,不好了吗?
我只是提供another way.....怎么这也too native了?





很aggressive的人是我,要抨击的还是这个地方

# 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  


My god,就是在C语言里,printf也不是这么用的.

#{..}这个总可以用吧,换行就\n就可以了,这位大侠好么,切着print和puts来回折腾,这样是否体现ruby很强大 ?
10 楼 Hooopo 2009-11-24  
0701 写道
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的抬杠

我有说楼主的代码不对,不好了吗?
我只是提供another way.....怎么这也too native了?


9 楼 ray_linn 2009-11-24  
222xiaohuan 写道
ray_linn 写道
这样也叫强大...在find的之上做的有意义的事为零。。。

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


ruby -e"system('dir /s *.rb')" ,这样的东西如果有意义的话,我每天有意义的东西也太多了些。
8 楼 0701 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的抬杠
7 楼 222xiaohuan 2009-11-24  
ray_linn 写道
这样也叫强大...在find的之上做的有意义的事为零。。。

这位大侠,你给大家解释一下什么才叫有意义的事,不要鄙视别人的劳动成果好不好
6 楼 Hooopo 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]}/ }

5 楼 Hooopo 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



4 楼 0701 2009-11-24  
ray_linn 写道
这样也叫强大...在find的之上做的有意义的事为零。。。

什么叫做DSL?
3 楼 0701 2009-11-24  
night_stalker 写道
囧啊,本来一行就能搞定的事情 ……
Dir.glob '*.rb'


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

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

相关推荐

    Python3指定路径寻找符合匹配模式文件

    这里给定一个搜索路径,需要在此目录中找出所有符合匹配模式的文件 import glob, os def all_files(pattern, search_path, pathsep = os.pathsep): for path in search_path.split(pathsep): for match in glob....

    spark-json-schema:适用于Apache Spark的JSON模式解析器

    spark-json-schema ... 通过提供输入文件的路径来解析给定的json模式文件。 该文件应相对于resources文件夹: val schema = SchemaConverter .convert( " schemaFile.json " ) 或者,您可以将convertCont

    AES 5.1.0 版 加密与解密软件

    1、本软件中在所给定的密钥长度小于所需的密钥长度时采取了自动补全的策略,同时将其中的不可显示字符(如:回车符)用空格取代策略。在初始向量的导入也采用了将其中的不可显示的字符(如:回车符)用空格取代的...

    IO输入输出留

    File.createTempFile() 在系统临时目录创建临时文件 目录列表 list() 返回 String[],包含子文件、子目录名称 listFiles() 返回 File[],包含子文件、子目录的 File 对象 ...

    API之网络函数---整理网络函数及功能

    GetPrivateProfileSection 获取指定小节(在.ini文件中)所有项名和值的一个列表 GetPrivateProfileString 为初始化文件中指定的条目取得字串 GetProfileInt 取得win.ini初始化文件中指定条目的一个整数值 ...

    Detection-of-epistasis-patterns-in-genetic-data.:Master2专案

    硕士2项目生物信息学,南特大学,Quentin Clayssen,Antoine Laine 使用Memetic和路径重新链接方法检测上位模式项目初始化为了编译整个项目,在项目的根目录提供了一个makefile。 这个makefile将调用每个方法的...

    Oracle9i的init.ora参数中文说明

    如果为此参数指定了一个值, 则该值将覆盖 make 文件中的默认值。 值范围: C 编译程序的完整路径。 默认值: 无 remote_dependencies_mode: 说明: 用于指定数据库为远程 PL/SQL 存储的过程处理被依赖对象的方式。如果...

    Windows 系统错误代码简单分析

     0317 在 %2 的消息文件中,系统无法找到消息号为 0x%1 的消息文本。  0487 试图访问无效地址。 0534 运算结果超过 32 位。  0535 该管道的另一方有一进程。  0536 等候进程打开管道的另一端。  ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...

    ROS机器人操作系统入门 Tutorials CN版 20150726

    一个node可以在一个给定的topic中发布消息。Topic是一个name被用于描述消息内容。一个node针对某个topic关注与订阅特定类型的数据。可能同时有多个node发布或者订阅同一个topic的消息;也可能有一个topic同时发布或...

    测试覆盖率

    在测试生命周期中,缺陷趋势遵循着一种比较好预测的模式。在生命周期的初期,缺陷率增长很快。在达到顶峰后,就随时间以较慢的速率下降。  要发现问题,可以根据这一趋势复审项目时间表。例如,在四个星期的生命...

    美萍足浴软件1010v2

    (注:手牌在系统主界面中以图标显示,单击主界面中的 “图标/列表” 按钮可切换显示模式) 进入 “顾客开单” 界面后(如图2),可以看到各个包间的可供手牌和相关费用。 押金金额(根椐本店情况而定) 填写完之后...

    数据库系统概论第四版答案

    而在文件系统中,数据的存取单位只有一 个:记录,如一个学生的完整记录。 ( 2 )数据的共享性高,冗余度低,易扩充数据库的数据不再面向某个应用而是面向整个 系统,因此可以被多个用户、多个应用以多种不同的语言...

    软件工程知识点

    在组装过程中,需要对整个系统进行集成测试,以确保系统在技术上符合设计要求,在应用上满足需求规格要求。 5.系统确认验证 在完成对系统的集成之后,接着还要对系统进行确认验证。 系统确认验证需要以用户为主体,...

Global site tag (gtag.js) - Google Analytics