find命令不适用于Java,但适用于系统外壳

时间:2018-06-25 07:42:45

标签: java linux shell find filesystems

在Java程序中,我想在目录.file.xyz中找到隐藏文件/my/dir的路径。它包含一个不应搜索的子文件夹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());
}

如果我将命令粘贴到终端中并在其中执行。很好。
我的操作系统是Ubuntu 16.04。
你能解释一下为什么吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您使用了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 数组传递给exec()

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