我想将一个目录全局化以后处理头文件。但我想排除项目中的一些目录。现在默认方式是......
Dir["**/*.h"].each { |header|
puts header
}
如果它位于排除目录中,则手动检查每个标头条目似乎效率低下。
不要使用globbing,而是使用Find
。 Find旨在让您在遇到目录和文件时访问它们,并以编程方式决定何时退出目录并转到下一个目录。请参阅doc页面上的示例。
如果你想继续使用globbing,这会给你一个起点。您可以在reject
中放置多个测试或者将它们组合在一起:
Dir['**/*.h'].reject{ |f| f['/path/to/skip'] || f[%r{^/another/path/to/skip}] }.each do |filename|
puts filename
end
您可以在测试中使用固定字符串或正则表达式。
我知道这已经晚了4年但是对于其他可能遇到这个问题的人来说,你可以从Dir中排除你从Bash通配符中排除的方式:
Dir["lib/{[!errors/]**/*,*}.rb"]
哪个将排除任何以“错误”开头的文件夹,你甚至可以省略/
并将其变成一个通配符,如果你愿意的话。
来自Rake gem的FileList
(默认情况下几乎总是安装,并且包含在Ruby 1.9的标准库中):
files = FileList['**/*.h'].exclude('skip_me')
FileList
有很多功能可以有效地处理globs。
你可以在这里找到文档:http://rake.rubyforge.org/classes/Rake/FileList.html
files = Dir.glob(pattern)
files -= Dir.glob("#{exclude}/**/*")
单程:
require 'find'
ignores = ['doc','test','specifications']
Find.find(ENV['HOME']) do |path|
name = File.basename(path)
if FileTest.directory?(path)
if ignores.include?(name)
Find.prune
else
next
end
else
puts path if name =~ /.h$/
end
end
这类似于其他几个答案,只是略有不同
我会创建一个可以传递给.each迭代或其他东西的数组。
release_safelist = Dir.glob('*')。拒绝{| file | (file ==“softlinks”)|| (file ==“ci”)|| (file.include?“SNAPSHOT”)}
在这种情况下,我创建一个没有文件/目录的数组,命名为ci,softlinks或包含SNAPSHOT