Как в Эликсире отсортировать список каталогов по дате?

Как в Эликсире отсортировать список каталогов по дате?

File.ls/1 дает список, отсортированный только по имени файла.

Никакие другие функции в модуле File не подходят для этого.

Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
1
0
594
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, есть встроенная функция, о которой я не знаю, но вы можете создать свою собственную, используя File.stat!/2:

File.ls!("path/to/dir")
|> Enum.map(&{&1, File.stat!("path/to/dir" <> &1).ctime})
|> Enum.sort(fn {_, time1}, {_, time2} -> time1 <= time2 end)

Пример вывода:

[
  {"test", {{2019, 3, 9}, {23, 55, 48}}},
  {"config", {{2019, 3, 9}, {23, 55, 48}}},
  {"README.md", {{2019, 3, 9}, {23, 55, 48}}},
  {"_build", {{2019, 3, 9}, {23, 59, 48}}},
  {"test.xml", {{2019, 3, 23}, {22, 1, 28}}},
  {"foo.ex", {{2019, 4, 20}, {4, 26, 5}}},
  {"foo", {{2019, 4, 21}, {3, 59, 29}}},
  {"mix.exs", {{2019, 7, 27}, {8, 45, 0}}},
  {"mix.lock", {{2019, 7, 27}, {8, 45, 7}}},
  {"deps", {{2019, 7, 27}, {8, 45, 7}}},
  {"lib", {{2019, 7, 27}, {9, 5, 36}}}
]
... |> Enum.sort_by(&elem(&1, 1))
Aleksei Matiushkin 29.07.2019 08:27

Edit: As pointed out in a comment, this assumes you're in the directory you want to see the output for. If this is not the case, you can specify it by adding the :cd option, like so:

System.cmd("ls", ["-lt"], cd: "path/to/dir")

Вы также можете использовать System.cmd/3 для достижения этой цели.

В частности, вы хотите использовать команду "ls" с флагом "-t", которая будет сортировать по дате модификации и, возможно, "-l", которая предоставит дополнительную информацию.

Поэтому вы можете использовать его следующим образом:

# To simply get the filenames sorted by modification date

System.cmd("ls", ["-t"])

# Or with extra info

System.cmd("ls", ["-lt"])

Это вернет кортеж, содержащий строку с результатами и число со статусом выхода.

Итак, если вы просто назовете его так, он выдаст что-то вроде:

iex> System.cmd("ls", ["-t"])
{"test_file2.txt\ntest_file1.txt\n", 0}

Имея это, вы можете делать много вещей, даже сопоставлять шаблоны с кодом выхода для соответствующей обработки вывода:

case System.cmd("ls", ["-t"]) do
  {contents, 0} ->
    # You can for instance retrieve a list with the filenames
    String.split(contents, "\n")
  {_contents, exit_code} ->
    # Or provide an error message
    {:error, "Directory contents could not be read. Exit code: #{exit_code}"
end

Если вы не хотите обрабатывать код выхода и просто заботитесь о содержимом, вы можете просто запустить:

System.cmd("ls", ["-t"]) |> elem(0) |> String.split("\n")

Notice that this will however include an empty string at the end, because the output string ends with a newline "\n".

это предполагает, что вы находитесь в pwd, как указать каталог, который вы хотите проверить?

Charles Okwuagwu 27.07.2019 11:40

Ты прав. Для этого вы можете использовать опцию :cd. Обновлю ответ

sbacarob 27.07.2019 11:41

Другие вопросы по теме