find 命令不适用于 java,但适用于系统 shell

find command works not on java, but in system shell

在 Java 程序中,我想在目录 /my/dir 中找到隐藏文件 .file.xyz 的路径。这包含一个不应搜索的子文件夹,即 excludedFolder.
所以我用 find 搜索这个文件。我用 -prune 排除了所需的文件夹。

String findCommand = "find /my/dir -path /my/dir/excludedFolder -prune -o -name .file.xyz -print";
try{
   Process process = Runtime.getRuntime().exec(findCommand);
   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
   //nothing is shown here, but hsould
   bufferedReader.lines().forEach(System.out::println);
}catch(Exception e){
    System.err.println(e.getMessage());
}

如果我将命令粘贴到终端并在那里执行。它工作正常。
我的 OS 是 Ubuntu 16.04.
你能解释一下为什么吗?

您需要调用 "sh" 并将您的管道命令传递给该程序。 尝试:

ProcessBuilder b = new ProcessBuilder( "/bin/sh", "-c",
               "find /my/dir -path /my/dir/excludedFolder -prune -o -name .file.xyz -print" );

您使用了 the Runtime class 的错误 exec() 函数。

给定

String findCommand = "find /my/dir -path /my/dir/excludedFolder -prune -o -name .file.xyz -print";

Java代码

Runtime.getRuntime().exec(findCommand);

将尝试 运行 字面上命名为 "find /my/dir -path /my/dir/excludedFolder -prune -o -name .file.xyz -print" 的文件作为命令。

您想将参数传递给 find,而不是 运行 一些文件名看起来像命令的长命令。为此,您需要将 String array 传递给 exec():

String findCommand[] = { "find", "/my/dir", "-path",
    "/my/dir/excludedFolder", "-prune", "-o", "-name", ".file.xyz", "-print" };
...
Runtime.getRuntime().exec(findCommand);