2016-10-15 47 views
1

我正在編寫一個java程序來查找目錄中的特定文件(具有特殊權限和文件類型的文件)。由於沒有任何特殊字符,因此以下命令正確執行。如何轉義java特殊字符並運行Linux命令

find /home/Cnf271/Desktop/ -perm -4000 ; 

現在,如果我嘗試使用我的java程序執行以下命令,終端不會給出正確的結果。

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命令不給我一個正確的結果,因爲Linux的命令是包裹着特殊characters.How我在執行下面的命令我的java程序。

find /home/Cnf271/Desktop/ -name "*.txt" -perm -4000 -exec ls -ldb {} \; 

謝謝。被引用

+0

您是否嘗試過將雙反斜線''\\''前';'性格嗎?順便說一下,我沒有看到你在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

元素需要(或轉義特殊字符)的Linux命令外殼做必要通過Runtime.exec()執行時被引用(他們並不需要是從外殼保護)。

在代碼中,去除通配符搜索參數的額外報價:

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

我測試了這一點,並能夠在Linux上正確運行你的代碼,但我不得不刪除您-perm -4000參數,以獲得結果在我的情況。我收到沒有的結果,在"*.txt"附近有額外的引號,但沒有它們,一切都很好。

順便問一下,你也可以使用一個Scanner收集結果:

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

非常感謝!另外,我在我的String cmd中添加了雙引號以獲得結果。 String cmd =「find」+ fileDirectory +「-name」+ filetypecmd +「」+「-perm -4000」; – Cnf271