如何使用 grep 和 glob 在文件目录中查找字符串?

How to Find a String in a Directory of Files Using grep and glob?

所以在过去一个半小时左右的时间里,我一直在处理这个问题,只是不知道该怎么做。

在我的 Ruby test.rake 文件中,在创建快照 Gem 后从另一个项目调用该文件,我需要检查 Capybara 的依赖项是否存在于另一个项目的 Rakefile,因为我们已经弃用了 Capybara 并将其替换为其他项目。

所以,我做了一个简单的检查,看看项目是否包含 Feature/Capybara 测试,如果是,扫描每个规范测试,看看它是否依赖于 Capybara,如果是,记录警告用户 Capybara 已被弃用。

我的问题是,我根本无法让它工作。当我将其附加到 Jenkins 作业并 运行 它时,我不断在 else 子句中收到意外的 Print 语句。

我是不是漏掉了什么?据我了解,我的代码正在执行以下操作:

  1. 检查 spec/features 目录是否存在
  2. 使用 glob select 目录中以 .rb 结尾的所有文件(规范测试),每个文件实例都被分配给 file
  3. 获取 file 的当前实例,读取它的每一行,并使用 grep 查找其中单词 "capybara" 的任何实例,并打印出找到就留言吧。
  4. 否则,如果找不到该词,则在 else 子句中打印错误消息。

我对 Ruby 有点陌生,所以我觉得我可能在语法上遗漏了一些东西,但除此之外我很困惑!任何帮助将不胜感激!这是我试图解析的代码和 Rakefile 的样子:

test.rake:

  if Dir.exist?('spec/features')
      path = 'spec/features/'
      Dir.glob(path + '*.rb') {|file|
        if File.readlines(file).grep(/capybara/).any?
          print "The capybara dependency has been found!"
        else
          print "SOMETHING WENT WRONG"
        end
      }
  end

Rakefile:

#!/usr/bin/env rake
# frozen_string_literal: true

require 'roll_out/rake_tasks'
require 'roll_out/security'
require 'roll_out/jira'
require 'REDACTED/philter/lint_results'
require 'roll_out/capybara'

load 'REDACTED/tasks/REDACTED.rake'

除了 .each 缺失之外,您的代码看起来几乎不错

我做了测试,效果很好。

Dir.glob('spec/features/*.rb').each do |f|
        puts 'haha' if File.readlines(f).any?{|line| line.include?('capybara')}
end