grep для файлов и открыть полученные совпадения

grep для файлов и открыть полученные совпадения

Я пытаюсь открыть все файлы на основе некоторых возвращаемых значений grep в командной строке. Я знаю, что могу использовать опцию, -lчтобы возвращать только имена файлов, но я хотел бы объединить это как-то с другой серией флагов или аргументов, чтобы получить полные пути указанных файлов.

Я пробовал что-то вроде:

find . -iname "*.ext" | xargs grep -l "mystring" | xargs open

А также что-то вроде:

grep -HR -l mystring . | xargs open

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

ОБНОВЛЯТЬ:

Мне удалось добиться такого рода работы с

grep -HR -l mystring . | xargs -L 1 open

Проблема в том, что для многих файлов командная строка выдает два вида ошибок:

LSOpenURLsWithRole() failed with error -1712 for the file /Users/blah/blah.ext

The files /blah/blah/file.ext do not exist, где в пути есть пробел.

решение1

Если в именах файлов есть пробелы, то вам нужно использовать print0option для file, later -0для xargs, и в последнюю очередь -I {}для second xargs.

find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'

Протестировано с emacsпомощью openкоманды.

решение2

-execпринимает статус завершения команды, которую вы в него вставили, и использует его логически внутриfind

Итак, что-то простое вроде этого должно сработать.

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;

решение3

Я не уверен, какую версию grepвы используете, но если я grepправильно читаю man-страницу, то сканирование будет остановлено после первого успешного совпадения. Это то, что вы хотите? Из вашего вопроса я понял, что вы хотели "открыть все файлы".

Если вы не против использования vimили gvim, то вы можете использовать это:

$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list

(Я никогда не пробовал объединять эти две команды, так как vimне читает quickfix/ errorfileиз stdin)

Vim откроет первый файл /tmp/mystring.listи поместит курсор прямо в строку, где mystringбыл найден. Вы можете перейти к следующему экземпляру с помощью :cnи к предыдущему экземпляру с помощью :cp.

Если вы не являетесь vimпользователем и сказали, что связанный вопрос вам не очень помог, то этот find ... -print0должен помочь — как уже было предложено.

решение4

Использовать pwdпри поиске:

find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open

Связанный контент