Я пытаюсь запустить следующую команду:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +
Это возвращает ошибку:
find: missing argument to -exec
Я не вижу, что не так с этой командой, так как она соответствует странице руководства:
-exec команда {} +
Этот вариант опции -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпадающих файлов. Командная строка строится почти так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.
Я также попробовал:
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
find
. Хотя -exec cmd {} +
вариант POSIX и был доступен с 80-х годов, GNU find только добавила его (относительно) недавно (2005). Что find --version
тебе сказать?
-exec {} +
был добавлен в 4.2.12 в 2005 году. В более ранних версиях GNU вы можете использовать (не POSIX), -print0 | xargs -r0
чтобы получить нечто подобное. 4.1
с 1994 года.
-name
аргументы модели должны быть указаны: -name "*.c" -o -name "*.h"
. Это правда, хотя это не связано с -exec
ошибкой. Вы заметите, что все остальные ответы помещают символы подстановки в кавычки, хотя об этом упоминает только Жиль. … (Продолжение)
-name "*.[ch]"
без объяснения причин. Это дает преимущества упрощения командной строки и, в частности, устранения -o
. Найти выражения с участием -o
трудно понять правильно. Твое неправильно; если ваша команда исправлена, чтобы не выдавать ошибку (как в ответе Жиля), она будет выполняться grep
только для .h
файлов. Тебе нужно сделать '(' -name '*.c' -o -name '*.h' ')'
.
+
в конце?find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+