
Я пытаюсь открыть все файлы на основе некоторых возвращаемых значений 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
Если в именах файлов есть пробелы, то вам нужно использовать print0
option для 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