2016-10-15 24 views
1

ディレクトリ内に特定のファイル(特別なアクセス権とファイルタイプのファイル)を見つけるための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のコマンドシェルの相場(または特殊文字をエスケープ)する必要が

+0

あなたは二重のバックスラッシュ' '\\' ''前を試してみました:

ところで

、あなたもScannerが結果を収集するために使用することができますか?ところで、あなたのJavaコードに ';'文字を追加することはありません。 Javaではバックスラッシュを使用してエスケープするので、文字列の「二重エスケープ」文字を使用する必要があります。 –

+0

@MaartenBodewesはい私はバックスラッシュを試しました。 filetypecmd = "\" *。 "+ fileType +" \ "";私のJavaプログラムに構文エラーはありません。私は、バックスラッシュのような他の文字が含まれているので、Linuxはコマンドを実行しないと思います。今では、エスケープ文字を使ってjava構文エラーを隠すと、javaプログラムは正常に動作しますが、コマンドがLinux環境で実行されても適切な結果は得られません。ありがとう – Cnf271

+0

注: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問題)。 –

答えて

2

要素(彼らはシェルから保護である必要はありません)Runtime.exec()によって実行されたときにないは引用符で囲む必要があります。あなたのコードで

、ワイルドカード検索パラメータに余分な引用符を削除します。

String filetypecmd = " *." + fileType + " "; 

私はこれをテストし、Linux上で正しくコードを実行することができたが、私は結果を得るためにあなたの-perm -4000パラメータを削除する必要がありました私の場合。私はを受け取りました。の結果は余分な引用符が"*.txt"でありましたが、それらはすべて無かったです。 `文字;

Scanner results = new Scanner(process.getInputStream()); 
while (results.hasNextLine()) 
{ 
    System.out.println(results.nextLine()); 
} 
+0

ありがとうございます!また、結果を得るために、String cmdに二重引用符を追加しました。文字列cmd = "find" + fileDirectory + "-name" + filetypecmd + "" + "-perm -4000"; – Cnf271

関連する問題