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

168

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

Svish
источник
Если вам нужен быстрый результат, используйте 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
user46046
источник
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 введите описание изображения здесь

karthiks
источник
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 не распечатывать ошибки «Нет такого файла или каталога»?

CP3O
источник
Еще один способ избежать этих надоедливых. Нет таких ошибок файла , это направить 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