1

我想编写一个执行一些 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"并正确执行?

4

5 回答 5

9

cd是当前 shell 的内置命令——你不能执行它——它是一个内置的 shell,因为 cwd 是一个进程级别的设置,所以一个新进程有它自己的值。无法从 java 进程中更改 cwd 。

数组参数版本用于exec执行单个命令,您自己拆分参数,而不是执行多个命令。

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

于 2012-06-26T12:31:53.870 回答
2

将程序的最后一行从

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

到:

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

根据RunTime 文档,您将分别执行每一行。

于 2012-06-26T12:37:40.833 回答
2

您最好编写一个 shell 脚本来满足您的需要并从 Java 中调用它。

于 2012-06-26T12:45:23.873 回答
0

arr 数组必须存储命令的参数。不是单独的命令。参考我的问题。 从java运行shell命令

于 2012-06-26T12:31:35.400 回答
0

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

PS:恕我直言,这不是在 Java 中完成的。为此类事情使用脚本语言。更容易和更小的代码。对于每个问题,尝试使用正确的工具,而不是一个工具解决所有问题。

于 2012-06-26T12:45:14.277 回答