发现:缺少 -exec 参数

发现:缺少 -exec 参数

以下从终端工作没有问题

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.javajava Xx输出\;。如果我删除\\,它将;按预期打印。

答案2

不同的 shell 有时需要转义不同的字符,因此,根据您在终端中使用的 shell 以及您在脚本中使用的 shell(您说的是 bash,但您确定吗?),您可能会得到不同的结果。例如,Zsh 也需要您转义 {}:

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

从 Java 中,您可以尝试删除所有反斜杠或将第二行更改为:

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

相关内容