2012-05-22 38 views
5

下面的作品沒有問題的Java執行命令行程序「發現」從終端返回錯誤

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

哪裏testDir是包含一些文件(例如文件1,文件2和文件3)的目錄。

不過,我得到使用如下的錯誤Java中

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

的錯誤是

find: missing argument to `-exec' 

我相信我正確地轉義字符。我嘗試了幾種不同的格式,但無法使其工作。

更新 @jtahlborn完美地回答了這個問題。但是現在命令已經稍微改變了,可以在計算md5sum之前對dir中的每個文件進行排序,如下所示(我已經接受了原始問題的優秀答案,所以如果他們能夠提供格式。爲了這個,我想盡組合,我能想到沒有成功按照以下答案)

「找到TESTDIR型​​的F -exec的md5sum {} + |。AWK {打印$ 1} |排序| 的md5sum ;」

新的更新

管道,你需要一個殼,所以我結束了這一點,偉大的工程,你仍然可以得到的輸出。

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

您如何獲得反饋?一個[SSCCE](http://SSCCE.org)會很好。 –

回答

5

使用多參數調用exec(否則您可以通過轉義規則叮咬)。同時,因爲你不是從一個shell腳本中調用,你不需要逃避分號:

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

輝煌。我早些時候嘗試過,但將整個exec params作爲一個字符串 - 「-exec」,「md5sum {};」 –

+1

或Runtime.getRuntime()。exec(「find testDir -type f -exec md5sum {} \\;」。split(「」)); – ianpojman

+0

好吧,如果你可以格式化這個「find testDir -type f -exec md5sum {} + | awk {print $ 1} | sort | md5sum; –

0

類的東西管道,你需要一個外殼,你不得到的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" 
});