以下从终端工作没有问题
find testDir -type f -exec md5sum {} \;
其中 testDir 是一个包含一些文件(例如 file1、file2 和 file3)的目录。
但是,如果我使用类似下面的方法从 Bash 脚本或 Java 运行它
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("find testDir -type f -exec md5sum {} \\;");
我收到以下错误
发现:缺少“-exec”参数
有任何想法吗?
更新:这个问题在 stackoverflow 上得到了正确回答。我将在此关闭此问题。https://stackoverflow.com/questions/10704889/java-execute-command-line-program-find-returns-error
答案1
in是必需的,以防止 shell 将字符解释为命令分隔符。如果 Java 未在 shell 中执行该命令,请尝试删除转义,\
以便代码变为:-exec md6sum {} \;
;
\\
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("find testDir -type f -exec md5sum {} ;");
我刚刚通过下一个测试程序确认了这种行为:
import java.io.*;
class Xx {
public static void main(String args[]) throws Exception {
Process p = Runtime.getRuntime().exec("/bin/echo \\;");
InputStream in = p.getInputStream();
int c;
while ((c=in.read()) != -1)
System.out.write((char)c);
p.waitFor();
}
}
使用 进行编译javac Xx.java
,java Xx
输出\;
。如果我删除\\
,它将;
按预期打印。
答案2
不同的 shell 有时需要转义不同的字符,因此,根据您在终端中使用的 shell 以及您在脚本中使用的 shell(您说的是 bash,但您确定吗?),您可能会得到不同的结果。例如,Zsh 也需要您转义 {}:
find testDir -type f -exec md5sum \{\} \;
从 Java 中,您可以尝试删除所有反斜杠或将第二行更改为:
Process pr = rt.exec("find testDir -type f -exec md5sum \\{\\} \\;");