我想执行Runtime.getRuntime()。exec();在Java上列出某些目录中的文件。
所以我想传递这个命令“ls / mnt / drbd7 / i * | tail -1”,但因为命令返回null。我真的需要这个明星。我需要选择目录上修改的最后一个文件。我尝试使用java.io.File但它无法获取最后一个文件。
有人有提示吗? 提前致谢! 菲利普
答案 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}等等)。