Следующее работает с терминала без проблем.
find testDir -type f -exec md5sum {} \;
Где testDir - это каталог, содержащий некоторые файлы (например, file1, file2 и file3).
Однако, если я запускаю это из скрипта bash или из Java, используя что-то вроде
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("find testDir -type f -exec md5sum {} \\;");
, я получаю следующую ошибку
find: отсутствует аргумент `-exec '
blockquote>Есть идеи?
ОБНОВЛЕНИЕ: Ответ на этот вопрос был получен корректно при переполнении стека. Я закрою вопрос здесь. https://stackoverflow.com/questions/10704889/java-execute-command-line-program-find-returns-error
\
в -exec md6sum {} \;
необходимо, чтобы препятствовать тому, чтобы оболочка интерпретировала ;
символ как разделитель команды. Если Java не выполняет команду в оболочке, попытайтесь удалить выход \\
так, чтобы код стал:
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("find testDir -type f -exec md5sum {} ;");
Я только что подтвердил это поведение со следующей тестовой программой:
import java.io.*;
class Xx {
public static void main(String args[]) throws Exception {
Process p = Runtime.getRuntime().exec("/bin/echo \\;");
InputStream in = p.getInputStream();
int c;
while ((c=in.read()) != -1)
System.out.write((char)c);
p.waitFor();
}
}
Скомпилированный с javac Xx.java
, java Xx
выводы \;
. Если я удаляю \\
, это распечатает ;
как ожидалось.
Разные оболочки иногда требуют экранирования разных символов, поэтому в зависимости от того, какую оболочку вы используете в своем терминале и какую оболочку вы используете для своего скрипта (вы говорите bash, но уверены ли вы?), Вы можете получить разные результаты. , Zsh, например, потребует от вас также экранировать {}:
find testDir -type f -exec md5sum \{\} \;
Из Java вы можете попробовать удалить все обратные слеши или изменить вторую строку на:
Process pr = rt.exec("find testDir -type f -exec md5sum \\{\\} \\;");