我需要在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
有什么想法吗?或任何其他更好的方法来解决这个问题? 欢迎提出任何建议。
答案 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()
的结果。