【问题标题】:Execute ls star with Runtime.getRuntime() on Linux在 Linux 上使用 Runtime.getRuntime() 执行 ls star
【发布时间】:2013-02-21 20:12:55
【问题描述】:

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

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

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

【问题讨论】:

  • 一些显示您如何使用.exec() 的代码会有所帮助。关于这个问题的 cmets 应该会有所帮助
  • 在某种程度上这是 this question 的欺骗,但在评论中解决了这个问题。

标签: java linux shell runtime.exec


【解决方案1】:

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

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

【讨论】:

  • 一个小问题。将命令用作单个 StringString 数组有什么区别吗?
  • 我们的答案只在第 7 个单词开始出现分歧 :)
  • @madth3 在这里没什么区别,我更喜欢使用字符串数组。 ProcessBuilder 也更整洁...
  • 谢谢,我确实喜欢这样: Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "ls /mnt/drbd7/ i* | 尾 -1"});
【解决方案2】:

命令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?

【讨论】:

  • 也许在这种情况下,文件是按顺序创建的,ls 默认行为就足够了,但很好。
  • 对不起,我表达的方式不对。我会说我的文件的名称上有一个数字,它代表日期。新日期()。getTime()。因此,如果我订购它们,我应该总是得到最后一个。无论如何感谢您的建议:)
  • 不客气。但是你不应该接受这个答案,因为它并没有真正回答问题。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    在 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 等) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多