Я пытаюсь запустить следующую команду:
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 '{}' \+