Острота для рекурсивного списка каталогов в Ruby?

Какова самая быстрая, наиболее оптимизированная, острота способ получить массив каталогов (исключая файлы) в Ruby?

Как насчет включения файлов?

94
задан the Tin Man 27 May 2016 в 19:32
поделиться

4 ответа

Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files

Вместо Dir.glob (foo) вы также можете написать Dir [foo] (однако Dir.glob также может принимать блок , и в этом случае он будет давать каждый путь вместо создания массива).

Документы Ruby Glob

172
ответ дан 24 November 2019 в 05:59
поделиться

В PHP или других языках, чтобы получить содержимое каталога и всех его подкаталогов, вам нужно написать несколько строк кода, но в Ruby требуется 2 строки:

require 'find'
Find.find('./') do |f| p f end

это распечатает содержимое текущего каталога и все его подкаталоги.

Или короче: вы можете использовать обозначение '**' :

p Dir['**/*.*']

Сколько строк вы напишете на PHP или на Java, чтобы получить тот же результат?

2
ответ дан 24 November 2019 в 05:59
поделиться

Для списка каталогов попробуйте

Dir['**/']

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

Dir['**/*'].reject {|fn| File.directory?(fn) }

А для списка всех файлов и каталогов просто

Dir['**/*']
29
ответ дан 24 November 2019 в 05:59
поделиться

Быстрый однострочный

Только каталоги

`find -type d`.split("\n")

Каталоги и обычные файлы

`find -type d -or -type f`.split("\n")`

Чистый красивый рубин

require "pathname"

def rec_path(path, file= false)
  puts path
  path.children.collect do |child|
    if file and child.file?
      child
    elsif child.directory?
      rec_path(child, file) + [child]
    end
  end.select { |x| x }.flatten(1)
end

# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
7
ответ дан 24 November 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: