Если это будет обычная поисковая утилита, которую вы собираетесь использовать, вы можете взглянуть на ack , который сочетает в себе как find
, так и grep
вместе вэта функциональность, которую вы ищете.Он имеет меньше возможностей, чем grep
, хотя 99% моих запросов идеально подходят, если заменить все экземпляры grep
на ack
.
Помимо других приведенных ответов, я также предлагаю следующую конструкцию:
find . -type f -name "*.html" -print|xargs -I FILENAME grep "< string-to-find>" FILENAME
Еще лучше, если в именах файлов есть пробелы, вы можете либо заключить в кавычки "FILENAME"
, либо передать результат с нулевым символом в конце (вместо символа новой строки) от find
до xargs
, а затем получить xargs
stripсами по себе:
find . -type f -name "*.html" -print0|xargs -0 -I FILENAME grep "< string-to-find>" FILENAME
here --^ and --^
Здесь имя FILENAME
на самом деле может быть любым, но оно должно соответствовать обоим
find . -type f -name "*.html" -print0|xargs -0 -I FILENAME grep "< string-to-find>" FILENAME
here --^ and --^
Вот так:
find . -type f -name "*.html" -print0|xargs -0 -I GRRRR grep "< string-to-find>" GRRR
this --^ this --^
По сути, это делаетто же самое, что и {}
, используемый в самом операторе find
для указания "строки текста, которую он вернул".В противном случае, xargs просто привязывает результаты find
к КОНЦУ всех остальных команд, которые вы ему даете (что не очень помогает, если вы хотите grep
искать внутри файла, который обычно задается последний в командной строке).