当前位置: 首页 > 面试题库 >

Java执行命令行程序'find'返回错误

杨超
2023-03-14
问题内容

从终端以下作品没问题

find testDir -type f -exec md5sum {} \;

其中testDir包含一些文件(例如,file1,file2和file3)的目录在哪里。

但是,在Java中使用以下命令时出现错误

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("find testDir -type f -exec md5sum {} \\;");

错误是

find: missing argument to `-exec'

我相信我正确地转义了字符。我尝试了几种不同的格式,但无法正常使用。

UPDATE
@jtahlborn完美地回答了这个问题。但是命令现在已经稍作更改,以在计算md5sum之前对目录中的每个文件进行排序,如下所示(我已经接受了原始问题的出色答案,因此我会给别人买啤酒,如果他们可以提出格式的话)为此,我尝试了所有可以想到的组合,但都没有成功。

“找到testDir -type f -exec md5sum {} + | awk {print $ 1} | sort | md5sum;”

新更新

对于管道,您需要一个外壳,所以我最终得到了这个外壳,它的效果很好,您仍然可以得到输出。

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(new String[] 
{
    "sh", "-l", "-c", "find " + directory.getPath() + " -type f -exec md5sum {} + | awk '{print $1}' | sort | md5sum"
});

问题答案:

使用多参数调用exec(否则您可能会被转义规则咬住)。同样,由于您不是从shell脚本调用的,因此无需转义分号:

Process pr = rt.exec(new String[]{"find", "testDir", "-type", "f", "-exec", "md5sum", "{}", ";"});


 类似资料:
  • 问题内容: 我正在使用的程序使用ADB(Android调试桥)将文件发送到手机: 我希望程序等待ADB完成传输,但是ADB作为守护程序运行,因此永远无法完成。但是该程序仍在继续运行,并且某种程度上文件没有发送到我的手机(日志中没有例外)。当我从控制台运行命令时,它可以正常工作。 我究竟做错了什么?如何正确通过ADB发送文件? 注意:这将不起作用,因为ADB守护程序会将 所有输出 写入系统标准输出。

  • 试图执行这个,但什么也没发生。我用的是Ubuntu13.10。如何用java程序在ubuntu中做cd。我用过“-c”,但它不起作用。

  • 问题内容: 我有一个我需要使用程序执行的程序。有人可以指导我该怎么做吗? 我的命令是 问题答案: 您应该编写一个这样的Java程序,这是一个基于Nirman的技术博客的示例,其基本思想是执行如下调用PowerShell进程的命令: 为了执行Powershell脚本

  • 问题内容: 自寻找以来已经有一段时间了,但找不到解决方案。我试图在.jar文件中的Linux上执行bash命令。为此,我尝试了很多事情,包括: 因此,当我单击.jar文件时,我希望程序打开bash并执行命令(java -jar …),以执行程序的另一部分。 关于如何做的任何想法? 问题答案: 要了解这一点,您首先需要了解如何在shell提示符下运行该命令。 请注意双引号在哪里。第一个参数是。第二个

  • 问题内容: 所以我在这里有一个菜鸟般的时刻,我以前从未使用过命令行来运行Java程序,但现在我需要。我遇到的问题是,当我尝试运行程序时,出现ClassNotFoundException。我的课叫做OmadUpdate。我已经使用javac命令将OmadUpdate.java文件编译为OmadUpdate.class。我已经检查了目录,并且它们都绝对存在,但是当我运行java OmadUpdate命

  • 我下载了一个java程序,它由两个文件夹src和classes组成,分别包含源文件和类文件。现在,src和classes文件夹包含几个嵌套的子文件夹,其中最后一个子文件夹分别包含源文件和类文件。更准确地说,源文件和类文件的路径是src/edu/univ/。java和classes/edu/univ/。班假设包含main函数的文件是main。java,如何从命令行运行此程序。 我尝试过: 我也尝试过