Как в Эликсире отсортировать список каталогов по дате?
File.ls/1
дает список, отсортированный только по имени файла.
Никакие другие функции в модуле File
не подходят для этого.
Возможно, есть встроенная функция, о которой я не знаю, но вы можете создать свою собственную, используя 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}}}
]
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
, как указать каталог, который вы хотите проверить?
Ты прав. Для этого вы можете использовать опцию :cd
. Обновлю ответ
... |> Enum.sort_by(&elem(&1, 1))