【问题标题】:Do a global file search进行全局文件搜索
【发布时间】:2014-12-15 16:44:38
【问题描述】:

在 Ruby 中有什么方法可以对给定文件进行全局搜索?

我尝试了Dir.glob,但它在当前目录中搜索。对于Find 模块,我需要传递要搜索的目录列表。就我而言,我需要搜索可能位于任何目录中的特定文件。

如何在 Ruby 中做到这一点?

【问题讨论】:

  • 请定义“全局”
  • 在我的用户计算机中查找文件..
  • 虽然 Ruby 可以 做到这一点,但它远不是最好的工具。你没有说你正在使用什么操作系统,但 *nix 有 locatefind。第一个依赖于定期刷新的数据库,因此它包含有关磁盘上文件的当前信息,因此速度非常快。 find 迭代地搜索目录层次结构,并可以被告知查找具有特定名称或属性的文件。它很快,但因为它是在驱动器上行走,所以速度要慢得多。两者都比 Ruby 更快,但不如您编写的代码灵活。

标签: ruby file search find dir


【解决方案1】:

Find 递归到子目录,所以只要从根路径开始,它就会到处都是:

Find.find('/') do |path|
  # look for your filename
end

【讨论】:

  • Dir.glob('/**/some_file') 最终会找到它。在大磁盘上,两者都可以寻找很长时间。
  • @theTinMan 是的,我在我的块中添加了它并进行了测试。正如你在评论中提到的,我觉得它很慢。我目前正在研究缩小到特定目录以使其更快。感谢您的意见。
  • 最好的办法是编写几种不同的方法来完成同一件事,包括使用findlocate,并运行基准测试以测试每种方法的速度。您在灵活性与速度之间进行权衡,您可以告诉 Ruby 代码其搜索路径越多,搜索路径就越快,但它永远不会像操作系统工具那样快。
【解决方案2】:

在具有locate 命令行工具的系统上,例如 Linux 和 Mac OSX,您可以非常快找到文件,如下所示:

filename = "test"
array_of_files_found = `locate #{filename}`.split("\n")

注意将用户提供的参数传递到命令行的危险。 See this answer for details

另请注意,在 OSX 上,您可能需要创建支持 locate 命令的数据库,如下所示:

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 2012-07-29
    • 2021-05-10
    • 2017-06-08
    • 2011-01-15
    • 2023-03-02
    • 2010-11-11
    • 2010-11-25
    • 2017-06-04
    相关资源
    最近更新 更多