gpt4 book ai didi

ruby - 使用 ruby​​ 在路径中的文件中搜索文本

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:03 25 4
gpt4 key购买 nike

我需要搜索路径中的所有 *.c 源文件以查找对 *.h header 的引用以查找未使用的 C header 。我写了一个 ruby​​ 脚本,但感觉很笨拙。

我创建了一个包含所有 C 文件的数组和一个包含所有 H 文件的数组。我遍历头文件数组。对于每个 header ,我打开每个 C 文件并查找对 header 的引用。

有没有更简单或更好的方法?

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

最佳答案

正如已经指出的,您可以使用 Dir#glob 来简化您的文件查找。您还可以考虑切换循环,这意味着每个 C 文件打开一次,而不是每个 H 文件打开一次。

我会考虑使用类似下面的东西,它在 3 秒内在 Ruby 源代码上运行:

# 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" }

编辑:这不会列出任何 C 文件中未引用的 H 文件。为了确保捕捉到这些,必须显式初始化散列:

h_counts = {}
hfile_names.each { |hfile| h_counts[hfile] = 0 }

关于ruby - 使用 ruby​​ 在路径中的文件中搜索文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2092446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com