Для вашего конкретного примера вы можете сделать это:
find . -type f -name "*.txt" -exec grep FirstKeyWord {} \; | grep "SecondKeyWord"
Кстати, это также может быть сделано без использования второго grep. Вместо этого используйте egrep с двумя альтернативами FirstKeyWord за которыми следует SecondKeyWord или SecondKeyWord а затем FirstKeyWord:
find . -type f -name "*.txt" -exec egrep "FirstKeyWord.*SecondKeyWord|SecondKeyWord.*FirstKeyWord" {} \;
Если вы можете дать некоторые гарантии относительно результирующих имен путей из find (например, без начальных или внутренних пробелов и без новых строк в путевых именах), вы также можете сделать это следующим образом:
find . -type f -name "*.txt" -print | while read filename; do grep "FirstKeyWord" "${filename}" | grep "SecondKeyWord"; done
Более общий ответ «вы не можете» непосредственно из find . Передача команд или использование && или || это функция оболочки, а не функция выполнения процессов.
Я использовал этот шаблон раньше, но он хрупкий и более сложный:
find . -type f -name "*.txt" -print \
| sed -e 's;[\\$"`!];\\&;g' \
-e 's;^.*$;grep "FirstKeyWord" "&" | grep "SecondKeyWord";' \
| sh
Распечатайте каждое имя файла, используйте sed чтобы преобразовать его в сценарий оболочки на лету (старайтесь избегать символов в имени файла, которые могут вызвать проблемы при заключении в двойные кавычки оболочки), затем пропустите результат через оболочку.
Другое решение - создать сценарий оболочки, который выполняет вашу обработку, и вызвать этот сценарий оболочки из find:
$ cat grepit.sh
#!/bin/sh
grep "FirstKeyWord" "$1" | grep "SecondKeyWord"
$ find . -type f -name "*.txt" -exec sh grepit.sh {} \;