使用java Runtime api运行grep命令

时间:2014-01-02 04:40:07

标签: java unix grep runtime

我需要在unix服务器中查看文件列表中的一些文本(文件数量很大),然后在web gui中列出文件名。所以我决定通过使用Runtime.getRuntime()编写一个unix命令执行器来实现这一目标的最佳方法。 适用于大多数unix命令,但面对这个奇怪的grep问题。

首先是代码:

public class UnixCommandExecutor {

    private static StringBuffer output = new StringBuffer();

    public static String exec(String command) throws Exception{
        Process process = null;
        process = Runtime.getRuntime().exec(command);
        BufferedReader stdErr = getBufferedReader(process.getErrorStream());
        BufferedReader stdIn = getBufferedReader(process.getInputStream());
        StringBuffer data = extractData(stdErr);
        if (data.length() >= 1) {
            System.out.println("Error: " +data.toString());
            throw new Exception(data.toString());
        }
        data = extractData(stdIn);
        if (data.length() >= 1) {
            output = data;
            System.out.println("Output: " +data.toString());
        }
        return output.toString();
    }

    private static BufferedReader getBufferedReader(InputStream stream) {
        InputStreamReader inReader = new InputStreamReader(stream);
        BufferedReader buffReader = new BufferedReader(inReader);
        return buffReader;
    }

    private static StringBuffer extractData(BufferedReader reader)
            throws IOException {
        StringBuffer data = new StringBuffer();
        String s = "";
        while ((s = reader.readLine()) != null) {
            data.append(s + "\n");
        }
        return data;
    }

    public StringBuffer getOutput() {
        return output;
    }
}

现在调用会是这样的: String output = exec(" find.-name blah"); 这很好,结果很完美。或者任何其他unix命令执行并正确提供结果。

但是当使用grep命令时会出现一个奇怪的错误: String output = exec(" grep -l executor *");

Error: grep: *: No such file or directory

这很奇怪,因为如果我直接在unix上运行此命令,它会给出所需的结果。 还尝试给出类似的文件路径, String output = exec(" grep -l executor / file / path / *"); 即使这样,错误也是:

Error: grep: /file/path/*: No such file or directory

有什么想法吗?或任何其他更好的方法来解决这个问题? 欢迎提出任何建议。

1 个答案:

答案 0 :(得分:0)

*由shell解释,而不是grep本身。因此,如果从Java程序启动grep,它就不起作用。

您可以grep使用-r进行递归搜索,然后使用.作为当前目录:

grep -lr executor .

要模拟shell的行为,只需将*替换为您要搜索的文件夹中所有文件的空格分隔列表。您可以使用以下命令获取所有文件的列表:

StringBuilder str = new StringBuilder();

for (File f : new File("your folder").listFiles()) {
    if (f.isFile()) {
        str.append(' ').append(f.getPath());
    }
}

现在只需将*替换为str.toString()的结果。