1

如何在 Elixir 中获得按日期排序的目录列表?

File.ls/1给出仅按文件名排序的列表。

模块中的其他功能File似乎与此无关。

4

2 回答 2

3

也许有一个我不知道的内置函数,但是您可以使用以下方法制作自己的函数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}}}
]
于 2019-07-27T09:08:45.917 回答
2

编辑:正如评论中指出的那样,这假设您位于要查看其输出的目录中。如果不是这种情况,您可以通过添加:cd选项来指定它,如下所示:

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")

请注意,这将在末尾包含一个空字符串,因为输出字符串以换行符“\n”结尾。

于 2019-07-27T09:37:46.800 回答