Есть ли способ глотать каталог в Ruby, но исключить некоторые каталоги?
Я хочу, чтобы glob-каталог отправлял файлы заголовков после обработки. Однако я хочу исключить некоторые каталоги в проекте. Прямо сейчас по умолчанию...
Dir["**/*.h"].each { |header|
puts header
}
Кажется неэффективным проверять каждый заголовок вручную, если он находится в исключенном каталоге.
Ответы
Ответ 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