команда find работает не на java, а в системной оболочке - PullRequest
0 голосов
/ 25 июня 2018

В 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 голосов
/ 25 июня 2018

Вы используете неправильную exec() функцию класса Runtime .

Учитывая

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);
0 голосов
/ 25 июня 2018

Вам нужно вызвать "sh" и передать этой программе свою команду. Попробуйте:

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