Проблема, с которой вы сталкиваетесь, заключается в том, что оболочка сначала анализирует командную строку и видит две простые команды, разделенные &&
оператором:, 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"' {} \;
.