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

Java 在Linux上使用Runtime.getRuntime()执行ls star,java,linux,shell,runtime.exec,Java,Linux,Shell,Runtime.exec,我想执行Runtime.getRuntime().exec();在Java上列出某个目录中的文件 因此,我想传递这个命令“ls/mnt/drbd7/I*| tail-1”,但由于该星型命令返回null。我真的需要这颗星星。我需要选择目录中最后修改的文件。我尝试使用java.io.File,但它无法获取最后一个文件 有人有什么暗示吗? 提前谢谢! Felipe您需要将命令传递给shell,shell将展开星形并解释管道符号。你开始的不是一个过程,而是两个过程 bash -c ls /mnt/drb

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

因此,我想传递这个命令“ls/mnt/drbd7/I*| tail-1”,但由于该星型命令返回null。我真的需要这颗星星。我需要选择目录中最后修改的文件。我尝试使用java.io.File,但它无法获取最后一个文件

有人有什么暗示吗? 提前谢谢!
Felipe

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

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

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

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

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

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

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

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

命令
ls/mnt/drbd7/i*| tail-1
不会显示上次修改的文件,因为默认情况下,命令
ls
按名称对结果进行排序。 您可以改为执行
ls-t/mnt/drbd7/i*| head-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
)解决问题,命令行参数中的
*
等模式由命令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
)来解决这个问题。

一些代码可以说明如何使用
.exec()
。关于这个问题的注释在某种程度上应该是有帮助的,这是一个重复,但在注释中解决了这个问题。一些代码来说明如何使用
.exec()
。关于这个问题的评论应该在某种程度上有所帮助,这是一个愚弄,但那个问题在评论中得到了解决。一个小问题。将该命令用作单个
字符串
字符串
数组有什么区别吗?我们的答案仅在第7个单词开始出现分歧:)@madth3在这里没有任何区别,我更喜欢使用字符串数组
ProcessBuilder
也更整洁……谢谢,我是这样做的:processp=Runtime.getRuntime().exec(新字符串[]{/bin/bash',“-c”,“ls/mnt/drbd7/I*| tail-1});一个小问题。将该命令用作单个
字符串
字符串
数组有什么区别吗?我们的答案仅在第7个单词开始出现分歧:)@madth3在这里没有任何区别,我更喜欢使用字符串数组
ProcessBuilder
也更整洁……谢谢,我是这样做的:processp=Runtime.getRuntime().exec(新字符串[]{/bin/bash',“-c”,“ls/mnt/drbd7/I*| tail-1});也许在这种情况下,文件是按顺序创建的,
ls
默认行为就足够了,但有一点很好。对不起,我用了错误的方式表达。我想说,我的文件名称上有一个数字,它代表日期。新建日期().getTime()。所以如果我点的话,我应该总是最后一个。不管怎样,谢谢你的建议:)不客气。但是你不应该接受这个答案,因为它并没有真正回答这个问题。也许在这种情况下,文件是按顺序创建的,
ls
默认行为就足够了,但很好。对不起,我用错误的方式表达了。我想说,我的文件名称上有一个数字,它代表日期。新建日期().getTime()。所以如果我点的话,我应该总是最后一个。不管怎样,谢谢你的建议:)不客气。但是你不应该接受这个答案,因为它并不能真正回答问题。