如何执行路径名中包含空格的Java System(shell)命令?
我尝试过引号和反斜杠(),但它不起作用。
ln -s "dir1/dir2" "my\ dir/dir2"
答案 0 :(得分:26)
到目前为止,最可靠的方法是使用Runtime.exec(String[] cmdarray)。
如果使用Runtime.exec(String command),Java只会在空格上拆分命令。
命令字符串使用由调用new StringTokenizer(命令)创建的StringTokenizer分解为标记,而不进一步修改字符类别。然后,由tokenizer生成的标记以相同的顺序放置在新的字符串数组cmdarray中。
或使用ProcessBuilder这样的内容:
ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2");
Process p = pb.start();
答案 1 :(得分:7)
您真的需要在shell中执行它(例如,您是否需要对~
或*
等内容进行shell扩展?如果没有,您可以直接调用ln
:
Process p =
Runtime.getRuntime()
.exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"});
如果你真的需要一个shell,试试这个(这可能需要一些调整,具体取决于shell如何处理引号):
Process p =
Runtime.getRuntime()
.exec(new String[]{"/bin/sh", "-c", "ln -s \"dir1/dir2\" \"my\\ dir/dir2\""});
编辑:
我的印象是第二条路径中有一个字面反斜杠。如果它不应该从上面的字符串文字中删除\\
。
答案 2 :(得分:1)
这些都不适用于Lion。但是,以下方法确实有效,并且向后兼容Tiger。
Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"});
答案 3 :(得分:0)
您可以通过以下方式使用它,而无需引入任何反斜杠:
Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});