Порядок сортировки в `Dir.entries`

Есть ли фиксированный порядок сортировки по умолчанию, когда Dir.entries возвращает результаты? По опыту я знаю, что первые две записи: "." и "..".

Ответы

Ответ 1

В соответствии с документами Ruby, Dir.entries() не гарантирует какого-либо определенного порядка перечисленных файлов, поэтому, если вам нужен какой-то заказ лучше всего сделать это явно.

Например, если вам нужно сортировать по времени изменения файла (от самого старого до самого нового), вы можете сделать следующее:

Dir.entries('.').sort_by { |x| File.mtime(x) }

Ответ 2

Я думаю, что порядок сортировки по умолчанию отсутствует, но вы можете использовать Dir.entries('some_path_to_dir').sort для сортировки по ASC-пути.

Ответ 3

Развернув ответ на @maerics, ниже игнорируется . && .., фильтр на основе регулярных выражений и при необходимости выберите последний файл.

    Dir.chdir(in_dir)
    target_file   =  Dir.entries(in_dir).select(|x| 
                     x != '.' && 
                     x != '..' && 
                     x =~ /\somefile.txt\z/).sort_by{|f|File.mtime(f)}.last(1)
   puts "here i am #{target_file}"

Ответ 4

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

files_sorted_by_date = Dir["your regex"].sort_by { |x| File.birthtime(x) }.reverse

или

files_sorted_by_date = Dir["your regex"].sort_by { |x| File.birthtime(x) }

В зависимости от того, как ваши файлы сортируются.

Я не мог бы сделать то же самое с помощью метода Dir.entries