我想将一个目录用于后处理头文件。但我想排除项目中的一些目录。现在,默认方式是......
Dir["**/*.h"].each { |header|
puts header
}
如果每个标题条目都在一个排除目录中,那么它似乎是无效的。
答案 0 :(得分:51)
我知道这已经晚了4年但是对于其他可能遇到这个问题的人来说,你可以从Dir中排除与Bash通配符相同的方式:
Dir["lib/{[!errors/]**/*,*}.rb"]
哪个文件夹会排除任何以“错误”开头的文件夹,您甚至可以省略/
,如果需要,也可以将其转换为通配符。
答案 1 :(得分:24)
不要使用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
您可以在测试中使用固定字符串或正则表达式。
答案 2 :(得分:18)
来自Rake gem的FileList
(默认情况下几乎总是安装,并且包含在Ruby 1.9的标准库中):
files = FileList['**/*.h'].exclude('skip_me')
FileList
具有很多有效处理globs的功能。
您可以在此处找到文档:http://rake.rubyforge.org/classes/Rake/FileList.html
答案 3 :(得分:6)
files = Dir.glob(pattern)
files -= Dir.glob("#{exclude}/**/*")
答案 4 :(得分:3)
一种方式:
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
答案 5 :(得分:0)
这类似于其他几个答案,只是写得有点不同
我创建一个可以传递给.each迭代或其他东西的数组。
release_safelist = Dir.glob('*')。拒绝{|文件| (file ==“softlinks”)|| (file ==“ci”)|| (file.include?“SNAPSHOT”)}
在这种情况下我创建一个没有文件/目录的数组,命名为ci,softlinks或包含SNAPSHOT