Java执行命令行程序';查找';返回错误

Java执行命令行程序';查找';返回错误,java,bash,find,Java,Bash,Find,以下工作从终端开始没有问题 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 `-

以下工作从终端开始没有问题

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'
我相信我正确地避开了角色。我尝试了几种不同的格式,但我无法让它工作

更新@jtahlborn完美地回答了这个问题。但是命令现在有了细微的改变,在计算md5sum之前对dir中的每个文件进行排序,如下所示(我已经接受了原始问题的优秀答案,因此如果有人能提出这个问题的格式,我会给他们买一杯啤酒。我尝试了我能想到的所有组合,但都没有成功。)

“find 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", "{}", ";"});

对于管道之类的东西,您需要一个Runtime.exec没有的shell

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参数都是一个字符串-“-exec”,“md5sum{};”或者Runtime.getRuntime().exec(“find testDir-type f-exec md5sum{}\\”。split(“”);好的,如果你能格式化这个“find testDir-type f-exec md5sum{}+”;awk{print$1}排序}md5sum;”,我会给你买杯啤酒你是如何得到反馈的?A就可以了。