
Если я запускаю grep foo bar.txt
, grep выделяет каждое вхождение "foo" в bar.txt
. Но иногда мне нужно использовать его find
для определения того, какие файлы ищет grep. Поэтому я делаю что-то вроде этого:
find . -iname "*.abc" | xargs grep foo
Или это:
find . -iname "*.abc" -exec grep foo {} \;
В обоих случаях grep правильно находит вхождения «foo» в указанных файлах, но вывод не имеет никакой подсветки.
Как мне продолжить использовать find
grep для выбора файлов для поиска, не теряя при этом подсветку?
Я использую Gnome Terminal 3.4.1.1 на Ubuntu 12.04 с bash в качестве оболочки.
решение1
В обеих командах проблема заключается в том, что не сама grep
команда, а другая команда генерирует фактический вывод ( xargs
и find
, соответственно).
Эту проблему можно решить, напрямую вызвав grep
имя каждого файла:
IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
grep foo $FILE
done
unset IFS
Или в одной строке:
IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS
Как это работает:
IFS=$'\n'
устанавливает внутренний разделитель полей на символ новой строки (иначе пробелы в именах файлов вызовут проблемы).for FILE in $(COMMAND); do COMMANDS done
перебирает файлы, указанные вCOMMAND
, устанавливает переменнуюFILE
в текущий файл и выполняетCOMMANDS
.grep foo $FILE
ищет иfoo
отправляет$FILE
результатынапрямуюна экран.unset IFS
возвращает внутренний разделитель полей к значению по умолчанию (не требуется в скрипте).
решение2
Просто grep
снова раскрасьте ваш вывод.
Я сделал что-то похожее здесь:Получить дополнительные данные о совпадении с помощью grep