Есть ли способ поместить каталог в Ruby, но исключить некоторые каталоги? - PullRequest
25 голосов
/ 22 декабря 2010

Я хочу создать каталог для постобработки заголовочных файлов.Все же я хочу исключить некоторые каталоги в проекте.Сейчас по умолчанию используется способ ...

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

Кажется неэффективным проверять каждую запись заголовка вручную, если она находится в исключенном каталоге.

Ответы [ 6 ]

53 голосов
/ 30 декабря 2014

Я знаю, что это на 4 года позже, но для любого другого, кто может столкнуться с этим вопросом, вы можете исключить из Dir так же, как исключили бы из подстановочных знаков Bash:

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

Что исключит любую папку, котораяначинается с «ошибок», вы даже можете опустить / и превратить его в своего рода символ подстановки, если хотите.

24 голосов
/ 22 декабря 2010

Не используйте сглаживание, вместо этого используйте Find. Функция поиска предназначена для предоставления вам доступа к каталогам и файлам по мере их появления, и вы программно решаете, когда выйти из каталога и перейти к следующему. Смотрите пример на странице документа.

Если вы хотите продолжать использовать глобирование, это даст вам стартовое место. Вы можете поместить несколько тестов в reject или вместе:

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

В тестах можно использовать фиксированные строки или регулярные выражения.

18 голосов
/ 22 декабря 2010

Есть FileList из Rake Gem (который почти всегда устанавливается по умолчанию и включен в стандартную библиотеку в Ruby 1.9):

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

FileList имеет множество функций для работыс шарами эффективно.

Документацию можно найти здесь: http://rake.rubyforge.org/classes/Rake/FileList.html

7 голосов
/ 16 августа 2016
files = Dir.glob(pattern)
files -= Dir.glob("#{exclude}/**/*")
3 голосов
/ 22 декабря 2010

В одну сторону:

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 голосов
/ 19 декабря 2017

это похоже на несколько других ответов, написанных немного по-другому

Я создам массив, который можно передать в итерацию .each или что-то еще.

release_safelist = Dir.glob. ( '*') отклонить {| файл |(file == "softlinks") ||(файл == "ci") ||(file.include? "SNAPSHOT")}

В этом случае я создаю массив без файлов / dir с именем ci, softlinks или содержащим SNAPSHOT

...