Поиск текста в файлах в пути, используя ruby - PullRequest
1 голос
/ 19 января 2010

Мне нужно найти все исходные файлы *.c в пути, чтобы найти ссылку на заголовок *.h, чтобы найти неиспользуемые заголовки C. Я написал сценарий с рубином, но он очень неуклюжий.

Я создаю массив со всеми файлами C и массив со всеми файлами H. Я перебираю массив заголовочных файлов. Для каждого заголовка я открываю каждый файл C и ищу ссылку на заголовок.

Есть ли более простой или лучший способ?

require 'ftools'
require 'find'

# add a file search
class File
  def self.find(dir, filename="*.*", subdirs=true)
    Dir[ subdirs ? File.join(dir.split(/\\/), "**", filename) : File.join(dir.split(/\\/), filename) ]
  end
end

files = File.find(".", "*.c", true)
headers = File.find(".", "*.h", true)

headers.each do |file|

  #puts "Searching for #{file}(#{File.basename(file)})"
  found = 0

  files.each do |cfile|
    #puts "searching in #{cfile}"
    if File.read(cfile).downcase.include?(File.basename(file).downcase)
        found += 1
    end
  end

  puts "#{file} used #{found} times"

end

Ответы [ 4 ]

3 голосов
/ 19 января 2010

Как уже указывалось, вы можете использовать Dir#glob для упрощения поиска файлов. Вы могли бы также рассмотреть переключение ваших циклов, что означало бы открытие каждого файла C один раз, а не один раз для файла H.

Я хотел бы рассмотреть что-то вроде следующего, которое запускается на источнике Ruby за 3 секунды:

# collect the File.basename for all h files in tree
hfile_names = Dir.glob("**/*.h").collect{|hfile| File.basename(hfile) }

h_counts = Hash.new(0) # somewhere to store the counts

Dir.glob("**/*.c").each do |cfile| # enumerate the C files
  file_text = File.read(cfile) # downcase here if necessary
  hfile_names.each do |hfile|
    h_counts[hfile] += 1 if file_text.include?(hfile)
  end
end

h_counts.each { |file, found| puts "#{file} used #{found} times" }

РЕДАКТИРОВАТЬ: Это не будет перечислять файлы H, на которые нет ссылок ни в файлах C. Чтобы наверняка их перехватить, хеш должен быть явно инициализирован:

h_counts = {}
hfile_names.each { |hfile| h_counts[hfile] = 0 }
1 голос
/ 19 января 2010

Для поиска файлов *.c и *.h вы можете использовать Dir.glob

irb(main):012:0> Dir.glob("*.[ch]")
=> ["test.c", "test.h"]

Для поиска в любом подкаталоге вы можете передать **/*

irb(main):013:0> Dir.glob("**/*.[ch]")
=> ["src/Python-2.6.2/Demo/embed/demo.c", "src/Python-2.6.2/Demo/embed/importexc.c",
.........
0 голосов
/ 20 января 2010

FileList в Rake API очень полезен для этого. Просто знайте, что размер списка становится больше, чем у вас есть память для обработки. :)

http://rake.rubyforge.org/

0 голосов
/ 19 января 2010

Ну, как только вы нашли свои .c файлы, вы можете сделать с ними следующее:

1) открыть файл и сохранить текст в переменной 2) используйте 'grep': http://ruby -doc.org / core / classes / Enumerable.html # M003121

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...