ruby-on-rails - Ruby:遍历目录和文件

标签 ruby-on-rails ruby file loops directory

我编写了以下脚本来迭代目录、它的子目录及其文件:

    def self.search_files_in_dir_for(dir, strings)
        results = {}
        puts "Initializing test ..."
        Dir.foreach(dir) do |file|
            next if file == '.' or file == '..'
            puts 'TEST: Testing dir "' + dir + "/" + file + '"'
            if File.file?(file)
                puts 'TEST: Testing "' + dir + "/" + file + '"'
                line_number = 0
                IO.foreach(file) do |line|
                    line_number = line_number + 1
                    if strings.any? { |string| line.include?(string) }
                        string = strings.detect { |string| line.include?(string) }
                        puts source = file + ":" + line_number.to_s
                        results[source] = string
                    end
                end
            elsif File.directory?(file)
                # Search child directories
                search_files_in_dir_for(File.join(dir, file), strings)
            end
        end
    end

给定以下目录+文件结构:

- views
  - application
    - abcdefg
      - _partial2.html.erb
    - _partial1.html.erb
  - layouts
    - application.html.erb

当将 views 目录的路径作为 dir 传递时,我得到了输出:

Initializing test ...
TEST: Testing dir "views/application"
TEST: Testing dir "views/layouts"

我期望这样的事情:

Initializing test ...
TEST: Testing dir "views/application"
TEST: Testing dir "views/application/abcdefg"
TEST: Testing "views/application/abcdefg/_partial2.html.erb"
TEST: Testing "views/application/_partial1.html.erb"
TEST: Testing dir "views/layouts"
TEST: Testing "views/layouts/application.html.erb"

我在该脚本中做错了什么?

最佳答案

路径名#Glob

明显较短的版本,使用 PathnamePathname.glob :

require 'pathname'
files, dirs = Pathname.glob('**/*').partition(&:file?)

它为您提供两个数组:一个包含当前目录中的所有文件,另一个包含所有子文件夹。

对于特定的目录:

files, dirs = Pathname.glob(File.join(dir, '**/*')).partition(&:file?)

您只需要解析文件的内容

Grep 还是 ack?

您似乎正在尝试复制 grep , ackgit grep

您的代码已修复

这是您的代码的修改版本。最大的问题是 file 是相对路径。 File.file?(file) 总是返回 false :

@results = {}
def search_files_in_dir_for(dir, strings)
  Dir.foreach(dir) do |file|
    complete_path = File.join(dir, file)
    next if file == '.' or file == '..'
    if File.file?(complete_path)
      puts "TEST: Testing '#{complete_path}'"
      line_number = 0
      IO.foreach(complete_path) do |line|
        line_number = line_number + 1
        if strings.any? { |string| line.include?(string) }
          string = strings.detect { |string| line.include?(string) }
          source = complete_path + ":" + line_number.to_s
          @results[source] = string
        end
      end
    else
      # Search child directories
      search_files_in_dir_for(complete_path, strings)
    end
  end
end

search_files_in_dir_for(..., [..., ...])

p @results

关于ruby-on-rails - Ruby:遍历目录和文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867187/

相关文章:

ruby-on-rails - 未定义的方法 'dragonfly_accessor'

javascript - 如何在 Vuex 的 Action 中调用 Action

ruby-on-rails - 如何循环使用 Rails 模型参数

ruby-on-rails - 将 rbenv 与 Docker 结合使用

ruby - Make Coderay (in Pry) 高亮评论

ios - 在 iOS 上写一个文件

ruby-on-rails - Rails 社区命名连接模型的命名约定有哪些优点?

ruby-on-rails - Mongoid 相当于 create_with

在 C 中将字符串转换为 float ?

r - 如何用R删除文件?