Проблема, с которой вы сталкиваетесь, заключается в том, что оболочка сначала анализирует командную строку и видит две простые команды, разделенные &&оператором:, find . -iname \*.csv -exec grep foo {}и echo {} \;. Цитирование &&(find . -iname \*.csv -exec grep foo {} '&&' echo {} \; ) обходит, но теперь команда выполняется findчто - то вроде grepс аргументами foo, wibble.csv, &&, echoи wibble.csv. Вам нужно дать команду findзапустить оболочку, которая будет интерпретировать &&оператор:
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
Обратите внимание , что первый аргумент после sh -c SOMECOMMANDэто $0не $1.
Вы можете сохранить время запуска процесса оболочки для каждого файла, сгруппировав вызовы команд с помощью -exec … +. Для простоты обработки передайте какое-нибудь фиктивное значение, $0чтобы "$@"перечислить имена файлов.
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
Если команда оболочки состоит только из двух программ, разделенных &&, findможет выполнить задание самостоятельно: записать два последовательных -execдействия, а второе будет выполнено только в том случае, если первая выйдет со статусом 0.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(Я предполагаю, что grep и echoпредназначен только для иллюстрации, так как -exec echoможет быть заменен , -printи полученный выход не особенно полезно в любом случае.)
-execв последовательности или использовать один-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;.