Как найти файлы с определенным текстом в Терминале


168

Я хотел бы найти все файлы, которые содержат определенную строку текста. Как бы вы сделали это в Терминале?


Если вам нужен быстрый результат, используйте Spotlight. Также, если вы хотите найти файлы, которые не обязательно хранят текст непосредственно внутри файла, такие как PDF или ODF.
Джои

Хороший совет, но в моем случае я не уверен, что файлы проиндексированы, поскольку они находятся в сетевых драйверах. А также они являются XML-файлами, принадлежащими определенной программе.
Свиш

Взгляните на unix.stackexchange.com/a/37932/213832 это решение хорошо работает
boyd4715

Ответы:


280
grep -r 'text goes here' path_goes_here

1
Я бы посоветовал man grepоткрыть для себя все замечательные варианты grep
Людовик Куты

Это перечисляет каждый файл, который существует в пути и добавляет: No such file or directory я пытаюсь получить только список вхождений текста. Как мы можем получить этот список?
CP3O

7
Понял: grep -lr "text pattern" ./ -s; grep -lr "text pattern" [PATH OF PARENT] -s
CP3O

Но при этом возвращается содержимое соответствующих файлов, а не сведения о файле (имя, путь). Предложение @ CP3O работает.
геоэтерия

28

использовать прожектор

mdfind "text goes here"
mdfind -onlyin /home/user/Desktop -live "live update"

не забудьте посмотреть на:

man mdfind

2
Будет ли это работать для файлов, которые не попадают в центр внимания (например, файлы внутри скрытых папок, файлы конфигурации системы и т. Д.)?
Питер Берг

Grep, похоже, не разбирает файлы .xlsx, но это сработало нормально. Другой простой пример: mdfind -onlyin. "searchtext"
FvD

11
  1. Через Ack

brew install ack ack "text goes here"

  1. Через найти

find . |grep "text goes here"

  1. Через grep

grep -RnslI "text goes here"


4

Вы можете выбрать один из следующих вариантов в зависимости от вашего вкуса и потребностей. Предположим, вам нужно искать файлы, содержащие текст - «асинхронно», рекурсивно в текущем каталоге, вы можете сделать это одним из способов, как показано ниже:

Используя grep введите описание изображения здесь

Используя ack введите описание изображения здесь


2

Ответ Игнасио великолепен и помог мне найти файлы, содержащие определенный текст. Единственная проблема, с которой я столкнулся, заключалась в том, что при запуске этой команды были бы перечислены все файлы, включая тот, в котором шаблон не отображался.

No such file or directory Это то, что я вижу рядом с файлами, которые не содержат шаблон.

Если вместо этого вы добавляете -sв команду, как в grep -lr "text pattern" ./ -s:; grep -lr "text pattern" [PATH DIRECTORY] -sиспользуется, он покажет вам, какие файлы содержат шаблон.

Аналогично, если grep -nr "text pattern" ./ -s; grep -nr "text pattern" [PATH OF DIRECTORY] -sиспользуется команда, которая печатает файл плюс номер строки и вхождение шаблона.

Пожалуйста, поправьте меня, если мое понимание неверно.

Ссылка: Как я могу заставить grep не распечатывать ошибки «Нет такого файла или каталога»?


Еще один способ избежать этих надоедливых. Нет таких ошибок файла , это направить stderr к нулю. grep ... 2>/dev/null, Это решение работает для большинства программ, так как они сообщают об ошибках в потоке stderr, а не в stdout. Я использовал это решение много раз с find, так как он скажет, что для многих файлов отказано в разрешении .
jpaugh

(1) Если вы получаете No such file or directoryсообщения для существующих файлов, либо вы что-то делаете неправильно, либо ваша система сломана. (2) Какое отношение это [PATH OF PARENT]имеет к чему-либо?
G-Man

@ G-Man Я отредактировал ответ, чтобы показать [PATH OF DIRECTORY]только случай, когда кто-то незнакомый хотел узнать, почему я это сделал./
CP3O

@ G-Man Я использую Mac, а не Ubuntu, не знаю, как моя система будет сломана, я пока что ничего с этим не сделал.
CP3O
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.