2012-05-22 12 views
5

Las siguientes obras de la terminal hay problemaJava ejecutar programa de línea de comandos 'hallazgo' devuelve el error

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

Dónde testDir es un directorio que contiene algunos archivos (por ejemplo archivo1, archivo2 y archivo3).

Sin embargo, me sale un error al usar el siguiente en Java

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

El error es

find: missing argument to `-exec' 

Creo que estoy escapando los caracteres correctamente. He probado varios formatos diferentes y no puedo hacer que esto funcione.

ACTUALIZACIÓN @jtahlborn respondió perfectamente a la pregunta. Pero el comando ahora ha cambiado ligeramente para ordenar cada archivo en el directorio antes de calcular el md5sum y es el siguiente (ya he aceptado la excelente respuesta para la pregunta original, así que le compraré una cerveza a alguien si se le ocurre el formato . para esto he intentado todas las combinaciones que se me ocurre después de la respuesta a continuación sin éxito)

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

NUEVA ACTUALIZACIÓN

Para tubos, necesita una concha, así que terminé con esto, que funciona muy bien y todavía se puede obtener la salida.

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

¿Cómo recibir el voto? A [SSCCE] (http://SSCCE.org) estaría bien. –

Respuesta

5

utilice la llamada de múltiples argumentos a exec (de lo contrario, puede ser mordido por las reglas de escape). También, ya que no está llamando desde un script de shell, que no es necesario para escapar de la coma:

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

Brillante. Intenté esto antes, pero tenía todos los parámetros del ejecutor como una cadena: "-exec", "md5sum {};" –

+1

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

+0

Bien, le compraré una cerveza si puede formatear este "find testDir -type f -exec md5sum {} + | awk {print $ 1} | sort | md5sum;" –

0

Por cosas como tubería, necesita una cáscara que no se consigue 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" 
}); 
Cuestiones relacionadas