найти: отсутствует аргумент для -exec

Следующее работает с терминала без проблем.

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 '

Есть идеи?

ОБНОВЛЕНИЕ: Ответ на этот вопрос был получен корректно при переполнении стека. Я закрою вопрос здесь. https://stackoverflow.com/questions/10704889/java-execute-command-line-program-find-returns-error

1
задан 23 May 2017 в 15:39

2 ответа

\ в -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 выводы \;. Если я удаляю \\, это распечатает ; как ожидалось.

4
ответ дан 23 May 2017 в 15:39

Разные оболочки иногда требуют экранирования разных символов, поэтому в зависимости от того, какую оболочку вы используете в своем терминале и какую оболочку вы используете для своего скрипта (вы говорите bash, но уверены ли вы?), Вы можете получить разные результаты. , Zsh, например, потребует от вас также экранировать {}:

find testDir -type f -exec md5sum \{\} \;

Из Java вы можете попробовать удалить все обратные слеши или изменить вторую строку на:

Process pr = rt.exec("find testDir -type f -exec md5sum \\{\\} \\;");
0
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: