shell 有没有办法在Ruby中对一个目录进行全局搜索,但排除某些目录?

xt0899hw  于 2022-11-16  发布在  Shell
关注(0)|答案(6)|浏览(138)

我想对一个目录进行glob处理,以便对头文件进行后处理。但是我想排除项目中的一些目录。目前默认的方法是...

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

如果每个标题条目都在排除的目录中,手动检查它似乎效率低下。

tzcvj98z

tzcvj98z1#

我知道这是4年晚了,但对于其他任何人,可能会遇到这个问题,你可以从目录中排除同样的方式,你会从Bash通配符排除:

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

这将排除任何以“errors”开头的文件夹,如果需要,您甚至可以省略/并将其转换为通配符。

w8rqjzmb

w8rqjzmb2#

不要使用globbing,而是使用Find。Find的设计是为了给予你在遇到目录和文件时访问它们,你可以通过编程来决定何时跳出一个目录并转到下一个目录。参见doc页面上的示例。
如果你想继续使用globbing,这将给予你一个开始的地方。你可以把多个测试放在reject或'd中:

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

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

oalqel3c

oalqel3c3#

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

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

FileList有很多功能可以有效地使用glob。
您可以在此处找到文档:http://rake.rubyforge.org/classes/Rake/FileList.html

vhipe2zx

vhipe2zx4#

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

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
yduiuuwa

yduiuuwa6#

这与其他几个答案类似,只是写法稍有不同
我将创建一个数组,它可以传递给一个。

release_safelist = Dir.glob('*').reject{ |file|
  (file == "softlinks") || (file == "ci") || (file.include? "SNAPSHOT")
}

在本例中,我创建了一个不包含名为ci、softlinks或包含SNAPSHOT的files/dir的数组

相关问题