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は現在のシェルに組み込まれているコマンドです-実行できません-cwdはプロセスレベルの設定であるため、シェルビルトインであるため、新しいプロセスには独自の値があります。Javaプロセス内からcwdを変更する方法はありません。

配列引数バージョンexec、複数のコマンドを実行するためではなく、自分で引数を分割した単一のコマンドを実行するためのものです。

したがって、フルパスを指定するか、Javaで自分でコピーを実装する必要があります。

于 2012-06-26T12:31:53.870 に答える
2

必要なことを実行するシェル スクリプトを作成し、それを Java から呼び出す方がよい場合があります。

于 2012-06-26T12:45:23.873 に答える
2

プログラムの最終行を

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

に:

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

RunTime documentationに従って、各行を個別に実行します。

于 2012-06-26T12:37:40.833 に答える
0

arr配列は、コマンドの引数を格納する必要があります。分離されていないコマンド。私の質問を参照してください。 Javaからシェルコマンドを実行する

于 2012-06-26T12:31:35.400 に答える
0

ls -l /home/arps/FBI/hrs1.txtコメントで述べたように何も出力しない場合、名前を変更しようとしているファイルは単に存在しないため、例外はこれについて正しいです。

PS: これは Java で行うべきではありません。そのようなことにはスクリプト言語を使用します。はるかに簡単で小さなコードです。すべての問題に対して 1 つのツールではなく、問題ごとに適切なツールを使用するようにしてください。

于 2012-06-26T12:45:14.277 に答える