Как использовать трубу внутри -exec в поиске

Можно ли использовать трубку внутри -exec в поиске? Я не хочу, чтобы grep просматривал весь файл, но только через первую строку каждого файла.

find /path/to/dir -type f -print -exec grep yourstring {} \;

Я попытался установить там конвейеры с "cat" и "head -1", но это не сработало. Я пытался каким-то образом использовать скобки, но мне не удалось разобраться, как именно их там положить. Я был бы очень благодарен за вашу помощь. Я знаю, как это работать иначе, без использования находки, но мы пытались сделать это в школе с использованием поиска и конвейера, но не могли справиться.

find /path/to/dir -type f -print -exec cat {} | head -1 | grep yourstring \;

Это так или иначе, как мы пытались это сделать, но не могли справиться с круглыми скобками, и это возможно. Я попытался просмотреть сеть, но не мог найти ответы.

Ответ 1

Чтобы иметь возможность использовать канал, вам нужно выполнить команду оболочки, то есть команда с конвейером должна быть единственной командой для -exec.

find /path/to/dir -type f -print -exec sh -c "cat {} | head -1 | grep yourstring" \;

Обратите внимание, что приведенное выше является бесполезным использованием Cat, которое может быть записано как:

find /path/to/dir -type f -print -exec sh -c "head -1 {} | grep yourstring" \;

Еще один способ добиться того, что вы хотите сказать:

find /path/to/dir -type f -print -exec awk 'NR==1 && /yourstring/' {} \;

Ответ 2

Это не дает прямого ответа на ваш вопрос, но если вы хотите выполнить некоторые сложные операции, вам может быть лучше списать сценарии:

for file in $(find /path/to/dir -type f); do echo ${file}; cat $file | head -1 | grep yourstring; done