【问题标题】:Java execute command line program 'find' returns errorJava执行命令行程序'find'返回错误
【发布时间】:2012-05-29 02:42:22
【问题描述】:

以下从终端工作没问题

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 之前对目录中的每个文件进行排序,如下所示(我已经接受了原始问题的优秀答案,所以如果他们能想出格式,我会买啤酒为此。我已经尝试了我能想到的所有组合,但没有成功。)

"查找 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 就可以了。

标签: java bash find


【解决方案1】:

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

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

【讨论】:

  • 太棒了。我之前尝试过,但将整个 exec 参数作为一个字符串 - “-exec”、“md5sum {} ;”
  • 或 Runtime.getRuntime().exec("find testDir -type f -exec md5sum {} \\;".split(" "));
  • 好吧,如果你能格式化这个“find testDir -type f -exec md5sum {} + | awk {print $1} | sort | md5sum ;”,我给你买杯啤酒
【解决方案2】:

对于管道之类的东西,您需要一个运行时.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"
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2011-06-24
    • 1970-01-01
    • 2015-07-16
    • 2020-06-11
    • 2011-12-11
    相关资源
    最近更新 更多