0

我想执行 Runtime.getRuntime().exec(); 在 Java 上列出某个目录上的文件。

所以我想通过这个命令“ls /mnt/drbd7/i* | tail -1”,但是因为星号命令返回null。我真的需要这颗星。我需要选择目录上最后修改的文件。我尝试使用 java.io.File 但它无法获取最后一个文件。

有人有提示吗?提前致谢!费利佩

4

4 回答 4

2

您需要通过bashshell 传递命令,以便它可以glob将通配符转换为文件列表:

Runtime.getRuntime().exec(new String[]{ "/bin/bash", "-c", "ls", "/mnt/drbd7/i*", "|", "tail", "-1"});
于 2013-02-21T20:18:24.357 回答
1

您需要将该命令传递给一个 shell,该 shell 将展开星号并解释管道符号。你开始的不是一个,而是两个过程。

bash -c ls /mnt/drbd7/i* | tail -1
于 2013-02-21T20:18:12.623 回答
1

该命令ls /mnt/drbd7/i* | tail -1不会显示最后修改的文件,因为ls默认情况下该命令按名称对结果进行排序。你可以这样做ls -t /mnt/drbd7/i* | head -1

你可以使用这个问题的答案:

如何在 Java 目录中找到最后修改的文件?

于 2013-02-21T20:31:07.547 回答
0

在 Unix 下,命令行参数中的*和之类的模式由命令 shell 扩展,而不是由单个程序扩展。?知道如何处理通配符的程序有一些例外,但ls不是其中之一。管道也是如此:shell 知道如何处理它们,java.lang.Runtime但不知道。

因此,如果您想使用这些功能,则必须执行以下操作:

Runtime.getRuntime().exec("/bin/sh -c 'ls /mnt/drbd7/i* | tail -1'")

但请注意,这是一个非常特定于系统的解决方案(它甚至取决于当前用户的配置),可以通过纯 Java 解决问题(请参阅java.io.File.listFilesjava.nio.file.DirectoryStream等)。

于 2013-02-21T20:51:55.750 回答