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

时间:2010-12-22 01:54:41

标签: ruby bash shell

我想将一个目录用于后处理头文件。但我想排除项目中的一些目录。现在,默认方式是......

Dir["**/*.h"].each { |header|
    puts header
}

如果每个标题条目都在一个排除目录中,那么它似乎是无效的。

6 个答案:

答案 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