2012-08-03 71 views
2

我想在Java中運行一些unix/shell命令並處理輸出。我使用了getRuntime.exec(),但它沒有給出像ls directory_path/*.tar.gz這樣的命令的正確輸出。對於那個命令我的程序沒有給出任何輸出,但它給出了錯誤,說No such file or directory。但是相同的命令在命令提示符下提供正確的輸出。如何使用Java通配符運行unix/shell命令?

是否有任何其他方式來執行在Java中包含通配符的命令?

+0

仔細檢查你的路徑,也是當前目錄,你都在。 '沒有這樣的文件或目錄'意味着它正在正確執行命令,但該路徑不是你認爲它是什麼的。 – 2012-08-03 06:25:05

+0

你只是想列出文件?你可以用java代碼來做到這一點,而不是運行依賴於系統的「本地」工具。 – hennr 2012-08-03 07:13:54

回答

4

是否有任何其他方式來執行命令,其中包括Java通配符?

是的。

你在你的代碼的三個潛在的問題:

  1. 假設你想看到你需要把它產生的輸出護理外部命令的輸出,並且自己打印出來。

    按照我在這裏提供的示例:

  2. 如果你天真地經歷Runtime.exec。你要的* shell擴展不工作明確地通過/bin/bash

  3. 如果您嘗試列出的directory_path/*.tar.gz的內容,你應該知道,(如果你不開始與/directory_path相對當前工作目錄將得到解決。首先嚐試給出絕對路徑以確保其正常工作,然後嘗試找出爲什麼找不到相對路徑。

這裏是一個應該工作的完整例子:

Process proc = new ProcessBuilder("/bin/bash", "-c", 
            "ls /.../directory_path/*.tar.gz").start(); 

Reader reader = new InputStreamReader(proc.getInputStream()); 
int ch; 
while ((ch = reader.read()) != -1) 
    System.out.print((char) ch); 
reader.close(); 
+0

感謝您通過此獲得正確的輸出。那麼它是否也適用於其他命令? – akhila 2012-08-03 06:57:33

+0

是的,它適用於各種命令。 (但是除非你真的需要支持通配符,否則不要通過'/ bin/bash')。確保你註冊了所有有用的答案,並且[接受答案](http://meta.stackexchange.com/questions/5234/how-do-accepting-an-answer-work)如果它解決了你的問題。 – aioobe 2012-08-03 07:02:33

+0

好的謝謝。如何接受答案? – akhila 2012-08-03 07:08:27

0

這是因爲您指定了一個相對路徑並且您的應用程序正在工作目錄中運行。您指定的路徑相對於該工作目錄。

要了解絕對路徑,可以查看工作目錄。

System.out.println("Working directory: " + System.getProperty("user.dir")); 
+0

no here directory_path =/actual /僅限DEPOT。 – akhila 2012-08-03 06:17:56

+0

您應該知道,這意味着假設您位於基於Unix的操作系統上,那麼您的硬盤根目錄中有一個名爲「actual」的文件夾。 – 2012-08-03 06:19:14

+0

是的。那只是已有的路徑。相同的命令在命令提示符下工作。 – akhila 2012-08-03 06:22:35

0

「ls directory_path/* .tar.gz」相對於CURRENT目錄有效。

+0

no here directory_path =/actual/DEPOT – akhila 2012-08-03 06:18:37