パス名にスペースを含むJava System(シェル)コマンドを実行するにはどうすればよいですか?Javaがパス名にスペースを含むコマンドを実行します
引用符とバックスラッシュ()を入れてみましたが、動作しません。
ln -s "dir1/dir2" "my\ dir/dir2"
パス名にスペースを含むJava System(シェル)コマンドを実行するにはどうすればよいですか?Javaがパス名にスペースを含むコマンドを実行します
引用符とバックスラッシュ()を入れてみましたが、動作しません。
ln -s "dir1/dir2" "my\ dir/dir2"
これまでのところ最も信頼性の高い方法はRuntime.exec(String[] cmdarray)です。
Runtime.exec(String command)を使用すると、Javaは空白でコマンドを分割するだけです。
コマンド文字列は、新しい文字列カテゴリをさらに変更することなく、新しいStringTokenizer(コマンド)の呼び出しで作成されたStringTokenizerを使用してトークンに分割されます。トークナイザによって生成されたトークンは、新しい文字列配列cmdarrayに同じ順序で配置されます。
も参照してくださいg++: File not found
またはこのようなProcessBuilderなものを使用します。
ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2");
Process p = pb.start();
ProcessBuilderは推奨される方法です。これはRuntime.exec()よりもはるかに優れた空間を扱うことができるためです –
私は実際にJavadocに基づいてProcessBuilderを使ってサンプルを追加しました。それはあなたに見えますか? – Mikel
これを使ってみましたが、それでも動作しません。実行ファイルへのフルパスを指定する必要がありますか? – LanguagesNamedAfterCofee
をあなたは本当に例えば(シェルでそれを実行する必要がありますか、あなたは~
のようなものの拡大をシェルする必要がありますか*
など)?ない場合は、直接ln
を呼び出すことができます:あなたは本当にシェルが必要な場合は
Process p =
Runtime.getRuntime()
.exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"});
、これは(これはシェルが引用符を処理する方法に応じて、少し微調整が必要な場合があります)してみてください。
Process p =
Runtime.getRuntime()
.exec(new String[]{"/bin/sh", "-c", "ln -s \"dir1/dir2\" \"my\\ dir/dir2\""});
編集:
私は印象の下に2番目のパスにリテラルのバックスラッシュがあります。上記の文字列リテラルから\\
を削除する予定がない場合。
これらはライオンでは動作しません。ただし、以下は動作し、Tigerとの下位互換性があります。
Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"});
あなたはバックスラッシュを導入することなく、次のようにそれを使用することができます: `「\」は`ですので Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});
'「私の\ DIR/dir2のは、」' Javaで有効な文字列ではありません有効なエスケープシーケンスではありません。 '' my \\ dir/dir2 ''を試してください。 –
いいえ、それは私が文字列をprintlnするときの出力です。私はすでに "\\"を使用しています – LanguagesNamedAfterCofee
ああ、大丈夫です。それは明らかではなかった。万が一OS Xを使用していますか? http://stackoverflow.com/questions/697621/ –