Я пытаюсь найти определенную строку текста в файле где-то на моем жестком диске. Лучшее, что я придумал, это:

find -type f / | xargs cat | grep "string to find"

Но это просто говорит мне, существует ли строка где-то или нет.

Как я могу узнать, в каком файле я его нашел?

Есть ли способ лучше?

6 ответов6

5

Это должно сделать свое дело и намного проще:

grep -R "some string" /

добавление -n покажет вам номера строк, которые вам нужны:

grep -Rn "some string" /
4
find / -type f -exec grep "string" {} +

Это выполнит поиск без учета регистра, который будет медленнее, но более гибким:

find / -type f -exec grep -i "string" {} +

вы можете получить много результатов, так что вы можете направить их на меньшее, затем используйте f и b для перемещения вперед и назад страница за страницей к выводу:

find / -type f -exec grep -i "string" {} + | less

Если вы знаете, что ищете *.txt файлы, вы можете уточнить это еще больше:

find / -type f -name "*.txt" -exec grep -i "string" {} + | less
4

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

find -type f / | xargs grep "string to find"

Конечно, поиск каждого файла на вашем диске будет очень медленным. Возможно, вам лучше использовать какую-нибудь программу индексирования, если вам часто приходится искать подобным образом. Например, Beagle - довольно обширная поисковая система, она существует уже некоторое время. Другие варианты - KDE Strigi или Google Desktop.

По крайней мере, вы должны использовать «locate» вместо «find», он только индексирует имена файлов, а не их содержимое, но это все равно ускорит процесс. Кроме того, вы должны фильтровать по типу файла, прежде чем использовать grep. Например, использование grep для файла avi размером 100 МБ или чего-то другого - просто трата времени.

2

как насчет:

grep -r -H -i 'string' .
2

Как я могу узнать, в каком файле я его нашел?

Вам нужно использовать опцию ' -H ' с ' grep ' для печати соответствующего файла.


Также,

  • Также было бы неплохо использовать чуть более правильное предположение, чем корень (' / ').
  • Схема John переключателя -exec над ' | оператор поможет, когда у вас много файлов, которые ищут
1

Да, grep с флагом -r будет искать рекурсивно. Попробуйте команду как:

grep -ri 'hello' .

Который будет искать в текущем каталоге и во всех файлах и каталогах внутри него фразу "привет". Флаг -i делает его независимым от регистра, поэтому он также найдет "Hello", "HELLO" и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .