ディレクトリ内に特定のファイル(特別なアクセス権とファイルタイプのファイル)を見つけるためのJavaプログラムを作成しています。特殊文字がないので、次のコマンドは正しく実行されます。Javaの特殊文字をエスケープしてLinuxのコマンドを実行する方法
find /home/Cnf271/Desktop/ -perm -4000 ;
私のJavaプログラムを使用して次のコマンドを実行しようとすると、ターミナルで適切な結果が得られません。 Linuxのコマンドは、私は、次のコマンドを実行しない特殊なcharacters.Howに包まれているので
find /home/Cnf271/Desktop/ -name "*.txt" -perm -4000 -exec ls -ldb {} \;
のJavaプログラムは、
//
..
System.out.print("Please enter directory path: ");
fileDirectory = scan.next();
System.out.print("Please enter file type (txt/pdf): ");
fileType = scan.next();
filetypecmd = " \"*." +fileType+ "\" ";
System.out.println(filetypecmd);
String cmd = "find "+fileDirectory+ " -name "+filetypecmd+" -perm -4000" ;
Runtime run = Runtime.getRuntime();
Process process = run.exec(cmd);
BufferedReader buffer = new BufferedReader(new InputStreamReader(process.getInputStream()));
String space = "";
while ((space=buffer.readLine())!=null) {
System.out.println(space);
..
//
プログラムはfine.however作品、String cmd
コマンドは私に適切な結果を与えるものではありません私のJavaプログラム。
find /home/Cnf271/Desktop/ -name "*.txt" -perm -4000 -exec ls -ldb {} \;
ありがとうございます。 Linuxのコマンドシェルの相場(または特殊文字をエスケープ)する必要が
あなたは二重のバックスラッシュ' '\\' ''前を試してみました:
ところで、あなたも
Scanner
が結果を収集するために使用することができますか?ところで、あなたのJavaコードに ';'文字を追加することはありません。 Javaではバックスラッシュを使用してエスケープするので、文字列の「二重エスケープ」文字を使用する必要があります。 –@MaartenBodewesはい私はバックスラッシュを試しました。 filetypecmd = "\" *。 "+ fileType +" \ "";私のJavaプログラムに構文エラーはありません。私は、バックスラッシュのような他の文字が含まれているので、Linuxはコマンドを実行しないと思います。今では、エスケープ文字を使ってjava構文エラーを隠すと、javaプログラムは正常に動作しますが、コマンドがLinux環境で実行されても適切な結果は得られません。ありがとう – Cnf271
注:Java 7以降では、ファイルの権限も読み取ることができます。 Javaの中からファイルを検索するのは簡単です(https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#getPosixFilePermissions(java.nio.file) .Path、%20java.nio.file.LinkOption ...))、問題を回避します(XY問題)。 –