Подтвердить что ты не робот

Есть ли способ глотать каталог в Ruby, но исключить некоторые каталоги?

Я хочу, чтобы glob-каталог отправлял файлы заголовков после обработки. Однако я хочу исключить некоторые каталоги в проекте. Прямо сейчас по умолчанию...

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Один из способов:

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

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

Ответ 6

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

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

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

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