2013-02-16 65 views
0

我正尝试使用java代码执行查找命令。我做了以下操作:使用java代码执行* nix查找命令

sysCommand = "find . -name '*out*' > file1" 

Runtime runtimeObj = Runtime.getRuntime(); 

try { 
    Process processObj = runtimeObj.exec(sysCommand); 
    processObj.waitFor(); 
    ... 

这个Linux命令在我使用命令行时执行但在Java中失败,为什么?

+2

你的问题是什么? – Vulcan 2013-02-16 01:52:03

+0

我无法使用java代码执行此命令 – Maxwell 2013-02-16 01:53:37

回答

1

这个问题可能是duplicateduplicate

  • 不管怎么说,你可以使用File.list,你想要的文件的 类型提供过滤。你可以递归地调用它来获得所有的子目录。我不喜欢这个答案。你会认为有一个更简单的方法。

  • 我的一位朋友推荐从Apache运行一个命令Commons-Exec。它允许你在命令中使用超时。他推荐它,因为运行时可能会遇到大标准输出和标准错误。

+0

File.list是否适用于子目录。就像如果我有多个子目录中的文件,那么它会工作。 – Maxwell 2013-02-16 02:00:26

+0

不,我不认为它会找到子目录。有一个比[this]更好的方法(http://stackoverflow.com/questions/3008043/list-all-files-from-directories-and-subdirectories-in-java)。 – Jess 2013-02-16 02:06:02

+0

我已经包含了一个使用File.listFiles搜索子目录的答案。我建议使用'ProcessBuilder',但是是的,做一个子进程有风险,因为如果标准输出/错误缓冲区填满,某些操作系统会挂起进程。您必须使用这些流。 – 2013-02-16 02:16:20

1

据我所知,在Runtime.exec中不允许使用任何形式的管路运算符。如果您想将结果移至文件中,则必须通过Process.getInputStream以Java方式执行此操作。

1

如果你有兴趣在Java中这样做,那么你会想要做这样的事情:

public void find(File startDirectory, FileFilter filter, List<File> matches) { 
    File[] files = startDirectory.listFiles(filter); 
    for (File file:files) { 
     if(file.isDirectory()) { 
      find(file, filter, matches); 
     } else { 
      matches.add(file); 
     } 
    } 
} 

然后你需要,但写FileFilter接受符合您模式的目录和文件。