2015-09-23 4 views
7

Если бы я хотел, чтобы получить все CSS и JavaScript файловКак мне сделать Dir.glob, но исключить каталоги?

Dir.glob("dir/**/*.{css,js}) 

дает мне вещи, я не хочу, если есть папка с именем stupidfolder.js. Я бы просто изменил имя папки, но я не могу.

+0

Вы не объясните, что вы пытаетесь сделать, но, похоже, вы хотите, чтобы спуститься в каталог в поисках конкретных файлов. И если это так, класс Ruby's [Find] (http://ruby-doc.org/stdlib-2.2.3/libdoc/find/rdoc/Find.html) - отличный инструмент. Его скорость запуска более быстрая, и она более масштабируема, чем использование 'Dir.glob', которая сначала будет идти по иерархии, собирать список, а затем возвращать массив всего найденного. Документация Find показывает, как «подрезать» каталоги. –

+0

Да, я пытаюсь спуститься в каталог, чтобы получить пути ко всем файлам .css и .js, но, случается, есть неправильные имена папок, которые заканчиваются на .js, поэтому я бы хотел, чтобы они были исключены. Я не знал о Найти, поэтому я проверю это. – kayla

+0

Это небольшой шаг, чтобы отсеять папки, независимо от названия. 'File.directory? ('Path/to/folder_or_file')' скажет вам. Опять же, в документации конкретно показано, как это сделать. –

ответ

10

Вы не можете сделать это с помощью Dir.glob. Вы должны явно отклонить эти записи.

only_files = Dir.glob('*').reject do |path| 
    File.directory?(path) 
end 
4

Вы можете сделать это с Dir.entries

Dir.entries('../directoryname').reject { |f| File.directory?(f) } 
4

Это может быть преувеличением для вашей проблемы, но rake определяет класс FileList. Вы могли бы заменить Dir.glob с этим классом:

require 'rake' 
filelist = FileList.new("dir/**/*.{css,js}") 
filelist.exclude('**/stupidfolder.js') 
filelist.each do |file| 
    #... 
end 
+0

Это окольный путь, чтобы добраться до той же точки. –

+0

Мне нравится этот ответ, потому что его то, что должен сделать Rakefile. Просто альтернативный ответ, а не круглый ответ. – Pred

Смежные вопросы