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