Ruby Make Dir.glob работает на пути, включая тильду ~ - PullRequest
0 голосов
/ 06 января 2019

Я получил нулевое возвращение, когда Dir.glob("*", File::FNM_DOTMATCH) встретился с filepath, который содержит тильду, подобную этой:

  ~setup~.mak                            253.0 B

Это вся инструкция:

l = 
  Dir.
    glob("*", File::FNM_DOTMATCH).
    tap { |a| a.shift(2) }.
    map { |p,i| p.force_encoding('utf-8')}.
    sort_by { |d| File.mtime(d) }.reverse!  

Как я могу решить это?

1 Ответ

0 голосов
/ 06 января 2019

Проблема не имеет отношения к тильдам.

Dir::glob не обещает вернуть отсортированный список. Я подозреваю, что ваш shift(2) предназначен для избавления от . и .., но они не первые два элемента в списке. Кроме того, вам не нужно использовать banged версию reverse для возврата на место.

Явно отклоните эти фантомные каталоги:

  Dir.
    glob("*", File::FNM_DOTMATCH).
    reject { |a| a =~ /\A\.+\z/ }. # ⇐ THIS
    map { |p, i| p.force_encoding(Encoding::UTF_8) }.
    sort_by { |d| File.mtime(d) }.
    reverse

  # $ touch ~setup~.mak
  # $ ruby -e 'puts Dir.glob("*", File::FNM_DOTMATCH).reject { |a| a =~ /\A\.+\z/ }'
  #⇒ ~setup~.mak
...