Java ejecuta un comando con un espacio en el nombre de ruta

¿Cómo puedo ejecutar un comando del Sistema Java (shell) que tiene un espacio en el nombre de ruta?

Intenté poner comillas y una barra diagonal inversa (), pero no funciona.

ln -s "dir1/dir2" "my\ dir/dir2" 

Con mucho, la forma más confiable es usar Runtime.exec (String [] cmdarray) .

Si usa Runtime.exec (comando String) , Java solo divide el comando en espacios en blanco.

la cadena de comandos se divide en tokens usando un StringTokenizer creado por la llamada nueva StringTokenizer (comando) sin más modificaciones de las categorías de caracteres. Los tokens producidos por el tokenizer se colocan en la nueva matriz de matriz cmdarray, en el mismo orden.

Ver también g ++: Archivo no encontrado

O use ProcessBuilder algo como esto:

 ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2"); Process p = pb.start(); 

¿Realmente necesitas ejecutarlo en un shell (por ejemplo, necesitas expandir la expansión de cosas como ~ o * , etc.)? Si no, puede invocar ln directamente:

 Process p = Runtime.getRuntime() .exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"}); 

Si realmente necesita un intérprete de comandos, intente esto (esto puede necesitar un pequeño ajuste dependiendo de cómo el shell procesa las comillas):

 Process p = Runtime.getRuntime() .exec(new String[]{"/bin/sh", "-c", "ln -s \"dir1/dir2\" \"my\\ dir/dir2\""}); 

Editar:

Tenía la impresión de que el segundo camino tiene una barra invertida literal. Si no se supone que eliminar los \\ de los literales de cadena de arriba.

Ninguno de estos funciona en Lion. Sin embargo, lo siguiente funciona, y es compatible con versiones anteriores para Tiger.

 Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"}); 

Puede usarlo de la siguiente manera sin tener que introducir ninguna barra diagonal inversa: Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});