Я намагаюся запустити таку команду:
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 виявив, що додав його (відносно) недавно (2005 р.). Що find --version
вам каже?
-exec {} +
Додано в 4.2.12 в 2005 р. У старих знахідках GNU ви можете використовувати (non-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 '{}' \+