Ruby Dir ['** / *'] лимит? - PullRequest
       19

Ruby Dir ['** / *'] лимит?

3 голосов
/ 06 декабря 2010

Можно ли установить ограничение для метода Dir.each?Я хочу получить только последние 10 файлов (упорядоченных по дате создания).

Пример:

Dir[File.join(Rails.root, '*.json'), 10].each do |f|
  puts f
end 

Thx.

Ответы [ 3 ]

4 голосов
/ 06 декабря 2010

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

%x[ls -rU *.json | tail -10].split("\n")

В Mac OS, которая откроет оболочку, отсортируйте все файлы * .json по дате их создания в обратном порядке, возвращая последние десять. Имена будут возвращены в виде строки, поэтому split разбит их на массив в конце строки.

Команды ls и tail очень быстрые и выполняют свою работу в скомпилированном коде C, избегая циклов, которые мы должны были бы сделать в Ruby для фильтрации вещей.

Недостатком является зависимость от ОС. Windows может получить данные для создания, но команды разные. Linux не хранит дату создания файла.

2 голосов
/ 06 декабря 2010

Последние 10 файлов по ctime ...


Dir['*'].map { |e| [File.ctime(e), e] }.sort.map { |a| a[1] }[-10..-1]

Второй #map{} просто удаляет объекты ctime, так что если вы не против работать с массивом [ctime, fname] Вы можете оставить это.

0 голосов
/ 06 декабря 2010

Попробуйте каждый_with_index http://ruby -doc.org / core / classes / Enumerable.html # M003141

Dir[...].each_with_index do |f, i|
  break if i == 10
  puts f
end

И создайте сценарий для использования .atime http://ruby -doc.org / core / classes / File.html # M002547

для создания обычной системы именования на основе даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...