2012-05-22 3 views
5

Le seguenti opere dal terminale non è un problemaJava eseguire il programma da riga di comando 'find' restituisce l'errore

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

Dove testDir è una directory che contiene alcuni file (ad esempio file1, file2 e file3).

Tuttavia, ottengo un errore utilizzando il seguente in Java

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

L'errore è

find: missing argument to `-exec' 

Credo che sto scappando correttamente i caratteri. Ho provato diversi formati e non riesco a farlo funzionare.

UPDATE @jtahlborn ha risposto alla domanda perfettamente. Ma il comando ora è leggermente cambiato per ordinare ogni file nella cartella prima di calcolare md5sum ed è come segue (ho già accettato la risposta eccellente per la domanda originale quindi comprerò qualcuno una birra se riescono a trovare il formato . per questo ho provato tutte le combinazioni che posso pensare di seguire la risposta qui sotto senza successo)

"trovare testdir -type f exec md5sum {} + |. awk {print $ 1} | sorta | md5sum ;"

NUOVO AGGIORNAMENTO

per pipa, è necessario un guscio così ho finito con questo, che funziona alla grande e si può ancora ottenere l'output.

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

Come si ottiene il feedback? Un [SSCCE] (http://SSCCE.org) andrebbe bene. –

risposta

5

utilizzare la chiamata multi-argomento per exec (altrimenti è possibile essere morsi dalle regole di escape). Inoltre, dal momento che non sta chiamando da uno script di shell, non è necessario per sfuggire il punto e virgola:

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

Brillante. L'ho provato prima, ma avevo tutti i parametri exec come una stringa - "-exec", "md5sum {};" –

+1

o Runtime.getRuntime(). Exec ("find testDir -type f -exec md5sum {} \\;". Split ("")); – ianpojman

+0

Okay, ti comprerò una birra se puoi formattare questo "find testDir -type f -exec md5sum {} + | awk {print $ 1} | sort | md5sum;" –

0

per cose come il tubo, è necessario un guscio che non si ottiene con 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" 
});