我想对一个目录进行glob处理,以便对头文件进行后处理。但是我想排除项目中的一些目录。目前默认的方法是...
Dir["**/*.h"].each { |header| puts header }
如果每个标题条目都在排除的目录中,手动检查它似乎效率低下。
tzcvj98z1#
我知道这是4年晚了,但对于其他任何人,可能会遇到这个问题,你可以从目录中排除同样的方式,你会从Bash通配符排除:
Dir["lib/{[!errors/]**/*,*}.rb"]
这将排除任何以“errors”开头的文件夹,如果需要,您甚至可以省略/并将其转换为通配符。
/
w8rqjzmb2#
不要使用globbing,而是使用Find。Find的设计是为了给予你在遇到目录和文件时访问它们,你可以通过编程来决定何时跳出一个目录并转到下一个目录。参见doc页面上的示例。如果你想继续使用globbing,这将给予你一个开始的地方。你可以把多个测试放在reject或'd中:
Find
reject
Dir['**/*.h'].reject{ |f| f['/path/to/skip'] || f[%r{^/another/path/to/skip}] }.each do |filename| puts filename end
您可以在测试中使用固定字符串或正则表达式。
oalqel3c3#
Rake gem中有FileList(默认情况下几乎总是安装它,它包含在Ruby 1.9的标准库中):
FileList
files = FileList['**/*.h'].exclude('skip_me')
FileList有很多功能可以有效地使用glob。您可以在此处找到文档:http://rake.rubyforge.org/classes/Rake/FileList.html
vhipe2zx4#
files = Dir.glob(pattern) files -= Dir.glob("#{exclude}/**/*")
efzxgjgh5#
其中一个道:
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
yduiuuwa6#
这与其他几个答案类似,只是写法稍有不同我将创建一个数组,它可以传递给一个。
release_safelist = Dir.glob('*').reject{ |file| (file == "softlinks") || (file == "ci") || (file.include? "SNAPSHOT") }
在本例中,我创建了一个不包含名为ci、softlinks或包含SNAPSHOT的files/dir的数组
6条答案
按热度按时间tzcvj98z1#
我知道这是4年晚了,但对于其他任何人,可能会遇到这个问题,你可以从目录中排除同样的方式,你会从Bash通配符排除:
这将排除任何以“errors”开头的文件夹,如果需要,您甚至可以省略
/
并将其转换为通配符。w8rqjzmb2#
不要使用globbing,而是使用
Find
。Find的设计是为了给予你在遇到目录和文件时访问它们,你可以通过编程来决定何时跳出一个目录并转到下一个目录。参见doc页面上的示例。如果你想继续使用globbing,这将给予你一个开始的地方。你可以把多个测试放在
reject
或'd中:您可以在测试中使用固定字符串或正则表达式。
oalqel3c3#
Rake gem中有
FileList
(默认情况下几乎总是安装它,它包含在Ruby 1.9的标准库中):FileList
有很多功能可以有效地使用glob。您可以在此处找到文档:http://rake.rubyforge.org/classes/Rake/FileList.html
vhipe2zx4#
efzxgjgh5#
其中一个道:
yduiuuwa6#
这与其他几个答案类似,只是写法稍有不同
我将创建一个数组,它可以传递给一个。
在本例中,我创建了一个不包含名为ci、softlinks或包含SNAPSHOT的files/dir的数组