Как использовать трубу внутри -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