有没有办法在Ruby中创建一个目录但是排除某些目录?

我想将一个目录全局化以后处理头文件。 但我想排除项目中的一些目录。 现在默认方式是……

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的function。

您可以在此处找到文档: 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