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

5
以下内容可以在终端中正常运行。
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之前对每个文件进行排序,命令如下(我已经接受了原始问题的优秀答案,因此如果有人能够提供这个命令的格式,我会为他们买一瓶啤酒。我已经尝试了下面回答中提到的所有组合,但都没有成功。)

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

新的更新

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

你如何获得反馈?一个 SSCCE 就可以了。 - user unknown
2个回答

5

使用多参数调用exec(否则会被转义规则咬伤)。此外,由于您不是从shell脚本中调用,因此无需转义分号:

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

太棒了。我之前尝试过,但是整个exec参数都是一个字符串 -“-exec”,“md5sum {};” - Peter Kelly
1
或者 Runtime.getRuntime().exec("find testDir -type f -exec md5sum {} \;".split(" ")); - ianpojman
好的,如果你能格式化这个命令“find testDir -type f -exec md5sum {} + | awk {print $1} | sort | md5sum ;”,我会请你喝一杯啤酒。 - Peter Kelly

0

对于像管道这样的东西,你需要一个 shell,而 Runtime.exec 并没有提供它。

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"
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接