Java执行命令行程序 '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 `-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"
});

最佳答案

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

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

关于Java执行命令行程序 'find'返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10704889/

相关文章:

unix - 将 find 的输出重定向到文件的问题

java - 如何在 hibernate 注释类中将两列作为主键

java - 以编程方式将 PEM 文件转换为 PKCS8

linux - 为什么我的 cd 不能在 bash 中工作?

macos - Bash 的 command_not_found_handle() 问题

regex - Notepad++ regex 如何替换第三次出现的斜杠并绕过第一个和第二个斜杠?

java - 如何使用 SecureRandom 生成随机数

java - 为什么 Java 的 Math.min 在我的 Android 应用程序中如此缓慢?

bash:获取目录参数

file - 如何在文件中找到不可打印的字符?