【发布时间】:2014-01-02 04:40:07
【问题描述】:
我需要在 unix 服务器的文件列表(文件数量很大)中 grep 一些文本,然后在 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;
}
}
现在调用将是这样的: 字符串输出 = exec("find .-name blah"); 这工作正常,结果是完美的。或者任何其他 unix 命令执行并正确提供结果。
但是当使用 grep 命令时,它会给出一个奇怪的错误: 字符串输出 = exec("grep -l 执行器 *");
Error: grep: *: No such file or directory
这很奇怪,因为如果我直接在 unix 上运行这个命令,它会给出想要的结果。 还尝试给文件路径提供类似的东西, 字符串输出 = exec("grep -l 执行器 /file/path/*"); 即使这样,错误是:
Error: grep: /file/path/*: No such file or directory
有什么想法吗?或任何其他更好的方法来解决这个问题? 欢迎提出任何建议。
【问题讨论】:
-
好的..我得到了这个工作。基本上我需要两件事才能让它工作。首先使用
/bin/sh -c,其次使用Runtime.exec(String[])api。所以总的来说,我的方法调用现在看起来像String[] commands = new String[]{"/bin/sh","-c","grep -l executor *"}; exec(commands);工作得很好,结果显示了