найти строку во всех файлах в каталоге

Я хочу найти {{text}} во всех файлах и красный в новом файле. Я пробовал это, но это не работает для меня

 find . -type f -not -name "*.dll" -not -name "*.zip" -exec cat {} \; | grep "\{.*" | cut -d "{" -f1 | sort | uniq > keys.txt 

Я думаю, что вы ищете это:

 grep -FIrho '{{text}}' . >/tmp/keys.txt mv -f /tmp/keys.txt . 

Или, может быть, если вам действительно нужно исключить только файлы .dll и .zip :

 find . \( -name '*.zip -o -name '*.dll' \) -prune -o -type f -exec grep -Fho '{{text}}' {} + >/tmp/keys.txt mv -f /tmp/keys.txt . 

Обратите внимание, что keys.txt будет содержать ноль или более строк {{text}} . Возможно, вы намеревались попросить записать имена файлов, а не соответствующий контент? Или, может быть, вся строка, где {{text}} присутствует?

В качестве альтернативы рекурсивному вызову grep через shell и find магии, некоторые программы могут сделать утомительную работу за вас.

Например, с помощью silversearcher-ag ( https://geoff.greer.fm/ag/ ) или ack ( https://beyondgrep.com/ ) это так же просто, как:

 ack '{{text}}' 

или же

 ag '{{text}}' 

Эти инструменты также имеют преимущество, заключающееся в том, что они позволяют избежать поиска в двоичных файлах или в каталогах, таких как .git , .svn и т. Д., И намного быстрее, чем вызов grep в цикле.

Эти инструменты присутствуют в репозиториях основных дистрибутивов GNU / Linux.