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

时间:2012-05-22 15:14:31

标签: 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 `-exec'

我相信我正确地逃避了角色。我尝试了几种不同的格式,但我无法使用它。

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

  

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

NEW UPDATE

对于管道,你需要一个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"
});

2 个答案:

答案 0 :(得分:5)

使用对exec的多参数调用(否则你可以通过转义规则被咬)。此外,由于您不是从shell脚本调用,因此不需要转义分号:

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

答案 1 :(得分:0)

对于像pipe这样的东西,你需要一个你没有用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"
});