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

问题描述 投票:25回答:6

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

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

如果它位于排除目录中,则手动检查每个标头条目似乎效率低下。

ruby bash shell
6个回答
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

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


51
投票

我知道这已经晚了4年但是对于其他可能遇到这个问题的人来说,你可以从Dir中排除你从Bash通配符中排除的方式:

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

哪个将排除任何以“错误”开头的文件夹,你甚至可以省略/并将其变成一个通配符,如果你愿意的话。


18
投票

来自Rake gem的FileList(默认情况下几乎总是安装,并且包含在Ruby 1.9的标准库中):

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

FileList有很多功能可以有效地处理globs。

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


5
投票
files = Dir.glob(pattern)
files -= Dir.glob("#{exclude}/**/*")

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

0
投票

这类似于其他几个答案,只是略有不同

我会创建一个可以传递给.each迭代或其他东西的数组。

release_safelist = Dir.glob('*')。拒绝{| file | (file ==“softlinks”)|| (file ==“ci”)|| (file.include?“SNAPSHOT”)}

在这种情况下,我创建一个没有文件/目录的数组,命名为ci,softlinks或包含SNAPSHOT

© www.soinside.com 2019 - 2024. All rights reserved.