在Linux上使用Runtime.getRuntime()执行ls star

时间:2013-02-21 20:12:56

标签: java linux shell runtime.exec

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

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

有人有提示吗? 提前致谢! 菲利普

4 个答案:

答案 0 :(得分:2)

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

Runtime.getRuntime().exec(new String[]{ "/bin/bash", "-c", "ls", "/mnt/drbd7/i*", "|", "tail", "-1"});

答案 1 :(得分:1)

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

bash -c ls /mnt/drbd7/i* | tail -1

答案 2 :(得分:1)

命令ls /mnt/drbd7/i* | tail -1不会显示上次修改的文件,因为命令ls默认按名称对结果进行排序。 您可以改为ls -t /mnt/drbd7/i* | head -1

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

How do I find the last modified file in a directory in Java?

答案 3 :(得分:0)

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

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

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

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