如何在文件名列表中找到特定字符串?

时间:2016-03-28 18:32:47

标签: ruby

我需要搜索以.feature结尾的文件(POSTGETPUTDELETE)。我已经能够隔离.feature个文件,但我找不到具有上述字词的文件。

我使用以下内容显示.feature个文件:

featureLocation = puts Dir.glob "**/*.feature" # show all feature files
 puts featureLocation

我尝试了很多方法来遍历每个文件来查找单词,但还没有运气。

2 个答案:

答案 0 :(得分:0)

files = Dir.glob('**/*.feature')

files.each do |name|
  if File.read(name).include?('CERTAIN WORD')
    # DO SOMETHING WITH THE FAILE
  end
end

您可以更改此内容(阅读,替换,保存新内容):

content = File.read(name)
new_content = content.gsub(/SOME PATTERN/, 'REPLACEMENT')
File.open(name, 'w') { |file| file << new_content }

答案 1 :(得分:0)

有多种方法可以做到这一点。这是未经测试的,但这是我如何去做的主旨:

require 'find'

REPLACEMENTS = {
  'target1' => 'replacement1',
  'target2' => 'replacement2'
}

Find.find('./somedir') do |path|
  next if File.directory?(path)
  next unless File.extname(path) == '.feature'

  new_path = path + '.new' 
  File.open(new_path, 'w') do |fo|
    File.foreach(path) do |line|
      REPLACEMENTS.each do |t, r|
        line.gsub!(t, r)
      end
      fo.puts line
    end
  end

  old_path = path + '.old'
  File.rename(path, old_path)
  File.rename(new_path, path)
  # File.unlink(old_path)
end

在企业中编写生产代码时,我认为有几件事情很重要:

  1. 编写可扩展的代码。这意味着如果文件比您预期的要大得多,它就不会死或者会爬行。 File.foreach逐行读取文件,许多人认为这意味着它运行速度较慢或涉及更多工作。测试文件I / O,特别是slurping files vs. line-by-line表明随着文件大小的增加,read(AKA slurping)会大幅减慢。除非你完全确定,你的文件永远不会超过1MB,使用foreach
  2. 使用漂亮的起始结构来包含目标词及其替换词。哈希是一个很好的起点,因为目标/键可以是子字符串或正则表达式。解释正则表达式对于这个问题是偏离主题的,但Ruby和gsub and regular expressions作为哈希中的键是一个很好的组合。这里有很多答案显示如何做,加上文档有例子。
  3. Find.find并不为人所知;人们倾向于跳到Dir[...]Dir.glob,但我更喜欢Find。该文档有一个很好的例子,说明如何使用它。查找似乎更好地扩展,特别是当你必须走大目录时。
  4. 修改文件然后保存它们通常不能安全地完成,因为人们认为他们的代码或系统永远不会起作用。这不是一个好的假设。此代码打开一个新文件,然后逐行读取旧文件。对于每一行,搜索并替换目标,然后将该行写入新文件。处理旧文件后,将关闭新文件(作为使用open块的副产品)。然后重命名旧文件,将新文件重命名为旧文件的名称。如果发生故障,就会留下备份。然后,您可以选择删除旧文件。
  5. 这导致非常低的开销,运行速度非常快,并且可以很好地扩展/增长。

    使用* nix中的命令行工具findsed也可以轻松完成此任务,并且它可以非常快速地运行并且具有极高的可扩展性,因此它可以很快完成。很高兴研究这条路径,因为令人惊讶的是,在提示符或shell脚本中可以轻松完成某些文件任务。