Java执行Linux命令

时间:2012-06-26 12:14:18

标签: java linux

我想写一个执行某些Linux命令的java代码:

String cmd = "cd /home/arps/FBI" ;

Process p=Runtime.getRuntime().exec(cmd);


String [] arr = new String [9] ;
 arr[0] = "cd /home/arps/FBI" ;
 for(int n = 1 ; n < 9 ; n++){
 String command = "mv" + "  " +  "/home/arps/FBI/hr" + n + ".txt" + "    " + "/home/arps/FBI/hrs" + n +".txt" ;
 arr[n] = command ;
}


 Process pp=Runtime.getRuntime().exec(arr);

在上面的代码中:我尝试将名为hr1,hr2 ....的8个文件重命名为hrs1,hrs2 ...等。在cd命令中,我尝试输入所需的目录。但是,我也使用了绝对路径。但是代码给出了错误:

java.io.IOException: Cannot run program "cd": java.io.IOException: error=2, No such file or directory

java.io.IOException: Cannot run program "mv  /home/arps/FBI/hr1.txt    /home/arps/FBI/hrs1.txt": java.io.IOException: error=2, No such file or directory

任何人都可以帮助我,为什么会发生这种情况虽然我手动执行这些命令意味着"mv /home/arps/FBI/hr1.txt /home/arps/FBI/hrs1.txt"并正确执行?

5 个答案:

答案 0 :(得分:9)

cd是当前shell的内置命令 - 你无法执行它 - 它是一个内置的shell,因为cwd是一个进程级设置,所以一个新的进程拥有它自己的值。有no way来改变java进程中的cwd。

exec的{​​{3}}用于执行单个命令,您自己拆分参数,而不是执行多个命令。

因此,您需要提供完整路径,或者自己使用Java实现副本。

答案 1 :(得分:2)

更改程序的最后一行
Process pp=Runtime.getRuntime().exec(arr);

为:

 for (String cmdLine: arr) {
    Process pp=Runtime.getRuntime().exec(cmdLine);

您将根据RunTime documentation分别执行每一行。

答案 2 :(得分:2)

你可能最好编写一个shell脚本来完成你需要的东西并从Java调用它。

答案 3 :(得分:0)

arr数组必须存储命令的参数。没有分开的命令。请参考我的问题。 run shell command from java

答案 4 :(得分:0)

如果ls -l /home/arps/FBI/hrs1.txt没有像您在评论中所说的那样输出任何内容,那么您尝试重命名的文件根本就不存在,所以例外情况就是这样。

PS:恕我直言,这不是用Java完成的。使用脚本语言来做这些事情。方式更简单,代码更小。对于每个问题,尝试使用正确的工具,而不是一个工具用于解决所有问题。