2010-12-22 78 views

回答

21

请勿使用通配符,而应使用Find。查找旨在让您访问遇到的目录和文件,并以编程方式决定何时退出目录并转到下一个目录。请参阅文档页面上的示例。

如果你想继续使用globbing这会给你一个开始的地方。你可以把多个测试中reject或运算在一起:

Dir['**/*.h'].reject{ |f| f['/path/to/skip'] || f[%r{^/another/path/to/skip}] }.each do |filename| 
    puts filename 
end 

您可以在测试中使用的是固定的字符串或正则表达式。

+0

文件/目录的阵列我不能找出如何正确使用.reject。它不支持与.glob相同的通配符吗?想要做...拒绝{| f | f ['**/*。tmpl.html']} .each {... – SimplGy 2012-11-01 22:25:22

+2

也没有... .reject { | f | File.fnmatch('**。tmpl.html',f) } .each {... :) – SimplGy 2012-11-01 22:32:32

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 
16

有来自耙创业板公司FileList(这几乎总是默认安装的,并且包含在标准库中的Ruby 1.9):

files = FileList['**/*.h'].exclude('skip_me') 

FileList有大量的功能可以有效地处理球体。

您可以在这里找到的文档:http://rake.rubyforge.org/classes/Rake/FileList.html

42

我知道这4年迟,但对于其他人可能会碰到这个问题,你可以从迪尔排除,你会从猛砸通配符排除以同样的方式运行:

Dir["lib/{[!errors/]**/*,*}.rb"] 

这将排除任何以“错误”开头的文件夹,您甚至可以省略/并将其变为各种通配符,如果需要的话。

3
files = Dir.glob(pattern) 
files -= Dir.glob("#{exclude}/**/*") 
0

这类似于刚刚写有点不同

生病创建一个可以传递给。每次迭代或别的什么数组一些其他的答案。

release_safelist = Dir.glob('*')。reject {| file | (文件==“softlinks”)|| (文件==“ci”)|| (file.include?“快照”)}

在这种情况下创建即时没有命名或者Cl,软链接,或含有快照

相关问题