`
jsntghf
  • 浏览: 2533584 次
  • 性别: 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....

    从指定目录下查找指定文件的例子

    在Java中,可以使用`Files.walk()`方法从给定的起始路径开始,递归地遍历文件树。配合`Files.isRegularFile()`判断是否为普通文件,以及`Path.getFileName().toString()`获取文件名,可以筛选出符合条件的文件。 ...

    matlab开发-递归搜索文件

    在MATLAB中,递归搜索文件是一项非常实用的功能,它允许用户在指定的目录及其子目录下查找符合特定条件的文件或文件夹。这个过程通常涉及到编程中的递归概念,即函数调用自身来解决问题。在MATLAB中,我们可以利用...

    经过指定的中间节点集的最短路径算法

    在给定的"经过指定的中间节点集的最短路径算法"中,Matlab源码实现了更复杂的场景,即不仅要求找到最短路径,还要确保路径必须经过一组特定的中间节点,并且可能有特定的行驶方向限制。 1. **Dijkstra算法基础**:...

    systemverilog读写文件测试代码

    用于从文件中读取数据,并将其存入指定的变量中,格式如下: ```verilog int read = $fread(destination, file); ``` - `destination`: 指定的数据结构,用于存放读取的结果。 - `file`: 打开文件的句柄。 #### `$...

    Node.js设置项目路径.txt

    通常这些依赖会记录在项目的`package.json`文件中。可以通过执行以下命令来安装: ```bash npm install ``` #### 2. 运行开发服务器 一旦依赖安装完成,就可以启动开发服务器了。常见的开发命令包括`npm run dev`和...

    模板方法模式

    在给定的描述中,模板方法模式用于展示某个目录下所有文件的名字。这个过程可以按照不同的排序规则进行,如按文件大小、最后修改时间或文件名的字节顺序。这里,我们可以将这个过程看作一个算法,包含以下几个步骤:...

    批处理实现新建一和文件同名文件夹并将该文件放到文件夹中

    本文将深入解析如何利用批处理脚本来实现创建与文件同名的文件夹,并将文件移动到该文件夹中的过程,这是一项在数据管理、文件归档以及自动化处理流程中常见的需求。 ### 批处理脚本的核心概念 批处理脚本是基于...

    php实现文件管理与基础功能操作

    `glob()`函数用于搜索符合特定模式的文件名,它返回一个包含匹配结果的数组。 在实际应用中,这些函数和方法的组合使用可以实现各种复杂的文件管理和操作,比如文件上传、下载、移动、重命名、权限设置等。理解并...

    Pythonglob模块的应用glob文件路径查找.pdf-综合文档

    - `glob.glob(pattern)`:返回所有匹配给定模式的文件路径名列表。 - `glob.iglob(pattern)`:与`glob.glob`类似,不过返回的是一个迭代器。 ### 示例代码解析 ```python # -*- coding:utf-8 -*- import glob ...

    一个支持通配符的文件操作类

    在描述中同样强调了这个类与通配符的关联,意味着它可能提供了诸如搜索、复制、移动、删除等与文件相关的操作,并且这些操作可以基于包含通配符的模式来执行,而不是仅仅针对单个文件或固定的文件名。 在标签“文件...

    支持通配符的模式匹配算法

    通配符模式匹配是计算机科学中的一个重要概念,特别是在文本处理、搜索算法以及文件系统路径匹配等领域广泛应用。在给定的场景中,我们关注的是如何设计一个算法来处理包含特殊字符`?`和`*`的模式串,并在主串中找到...

    ANDROID文件操作

    在主活动中,用户可能通过EditText输入数据,然后通过RandomAccessFile类将输入的数据写入到文件中或从文件中读取数据,并将结果显示在TextView组件中。 在Android开发中,任何对文件的操作都可能抛出IOException,...

    python实现搜索指定目录下文件及文件内搜索指定关键词的方法

    在日常工作中,我们经常需要查找某个特定目录下的所有文件,甚至需要进一步搜索这些文件中的特定关键词。例如,在开发过程中可能需要快速定位含有某个变量或函数的所有文件,或者在维护文档时需要找到包含特定术语的...

    FATFS文件系统应用程序手册(中文版).pdf

    f_read函数用于从文件中读取数据。它需要文件对象指针(FIL* FileObject)、缓冲区指针(void* Buffer)、要读取的字节数(UINT ByteToRead),以及一个指向实际读取字节数的指针(UINT* ByteRead)。成功读取数据后...

    php操作文件函数

    33. **fscanf()**:从文件中按格式读取数据。 34. **fseek()**:在文件指针中设定新的读写位置。 35. **fstat()**:获取文件指针关联文件的信息。 36. **ftell()**:返回文件指针的当前位置。 37. **ftruncate()...

    Struts+1.x文件的上传和下载.txt

    尽管给定内容中未详细展示文件下载的实现,但可以推测其流程大致如下:在用户请求下载某个文件时,服务器会根据请求的参数找到对应的文件路径,然后创建文件的输入流,将其封装成HTTP响应的输出流,发送回客户端。...

    Java用File模糊删除少量文件

    在Java编程中,删除文件是一项常见的操作,但有时我们可能需要根据特定条件,如文件名的部分内容,来实现“模糊删除”少量文件。这通常涉及到文件I/O操作和正则表达式的应用。以下是对这个主题的详细解释: 首先,...

    FilenameFileter list 查看 java文件列表(过滤 java文件)

    在Java编程中,`FilenameFilter` 是一个接口,它用于过滤文件名,允许我们根据特定的文件扩展名或模式选择性地列出目录中的文件。在给定的标题和描述中,我们关注的是如何使用 `FilenameFilter` 来查看并列出只包含 ...

Global site tag (gtag.js) - Google Analytics