我想执行 Runtime.getRuntime().exec(); 在 Java 上列出某个目录上的文件。
所以我想通过这个命令“ls /mnt/drbd7/i* | tail -1”,但是因为星号命令返回null。我真的需要这颗星。我需要选择目录上最后修改的文件。我尝试使用 java.io.File 但它无法获取最后一个文件。
有人有提示吗?提前致谢!费利佩
我想执行 Runtime.getRuntime().exec(); 在 Java 上列出某个目录上的文件。
所以我想通过这个命令“ls /mnt/drbd7/i* | tail -1”,但是因为星号命令返回null。我真的需要这颗星。我需要选择目录上最后修改的文件。我尝试使用 java.io.File 但它无法获取最后一个文件。
有人有提示吗?提前致谢!费利佩
您需要通过bash
shell 传递命令,以便它可以glob
将通配符转换为文件列表:
Runtime.getRuntime().exec(new String[]{ "/bin/bash", "-c", "ls", "/mnt/drbd7/i*", "|", "tail", "-1"});
您需要将该命令传递给一个 shell,该 shell 将展开星号并解释管道符号。你开始的不是一个,而是两个过程。
bash -c ls /mnt/drbd7/i* | tail -1
该命令ls /mnt/drbd7/i* | tail -1
不会显示最后修改的文件,因为ls
默认情况下该命令按名称对结果进行排序。你可以这样做ls -t /mnt/drbd7/i* | head -1
。
你可以使用这个问题的答案:
在 Unix 下,命令行参数中的*
和之类的模式由命令 shell 扩展,而不是由单个程序扩展。?
知道如何处理通配符的程序有一些例外,但ls
不是其中之一。管道也是如此:shell 知道如何处理它们,java.lang.Runtime
但不知道。
因此,如果您想使用这些功能,则必须执行以下操作:
Runtime.getRuntime().exec("/bin/sh -c 'ls /mnt/drbd7/i* | tail -1'")
但请注意,这是一个非常特定于系统的解决方案(它甚至取决于当前用户的配置),可以通过纯 Java 解决问题(请参阅java.io.File.listFiles
、java.nio.file.DirectoryStream
等)。