Как использовать команду «grep» для поиска текста, включая подкаталоги

263

Я хочу найти все файлы, содержащие определенную строку текста. Команда grep работает, но я не знаю, как ее использовать для каждого каталога (я могу сделать это только для моего текущего каталога). Я пробовал читать man grep , но это не помогло.

    
задан Smile.Hunter 01.08.2011 в 13:38
источник

10 ответов

343

Лучше использовать

grep -rl "string" /path

где

  • -r (или --recursive ) используется для перемещения также всех подкаталогов /path , тогда как
  • -l (или --files-with-matches ) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может повысить скорость, учитывая, что grep перестает читать файл с первым совпадением с этой опцией).
ответ дан enzotib 01.08.2011 в 13:55
источник
124

Если вы ищете соответствие строк в файлах, моя любимая команда:

grep -Hrn 'search term' path/to/files
  • -H заставляет печатать имя файла (подразумевается при поиске нескольких файлов).
  • -r выполняет рекурсивный поиск
  • -n вызывает печать строки.

path/to/files может быть . для поиска в текущем каталоге

Другие варианты, которые я нахожу очень полезными:

  • -I игнорировать двоичные файлы (дополнение: -a обрабатывать все файлы как текст)
  • -F обрабатывает search term как литерал, а не регулярное выражение
  • -i делает поиск без учета регистра
  • --color=always , чтобы заставить цвета даже при прохождении через less . Чтобы добавить цвета поддержки less , вам нужно использовать опцию -r :

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir полезно для исключения каталогов, таких как .svn и .git .

    
ответ дан Lekensteyn 01.08.2011 в 14:27
источник
20

Я считаю, вы можете использовать что-то вроде этого:

find /path -type f -exec grep -l "string" {} \;

Объяснение из комментариев

find - это команда, которая позволяет находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах данного пути. Если вы не укажете маску, с которой должны встречаться имена файлов, она перечисляет все объекты каталога.

  • -type f указывает, что он должен обрабатывать только файлы, а не каталоги и т. д.
  • -exec grep указывает, что для каждого найденного файла он должен запустить команду grep, передав ее имя файла в качестве аргумента для него, заменив {} на имя файла
ответ дан dmityugov 01.08.2011 в 13:48
источник
17

Моя команда по умолчанию

grep -Rin string *

Я использую capitol 'R', потому что ls использует его для рекурсивного. Поскольку grep принимает оба, нет причин не использовать его.

ИЗМЕНИТЬ: за HVNSweeting, очевидно, -R будет следовать символическим ссылкам, где -r не будет.

    
ответ дан user606723 01.08.2011 в 16:43
источник
11

Если вы хотите попробовать что-то новое, откройте ack . Команда для рекурсивного поиска текущего каталога для string :

ack string

Установка довольно проста:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(Если у вас уже есть каталог ~/bin , и он предпочтительно находится в PATH .)

    
ответ дан Konrad Rudolph 01.08.2011 в 17:09
источник
3

Команда rgrep предназначена для такой необходимости

Если это невозможно, вы можете получить его так:

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

Вы можете напрямую установить в свои параметры grep по умолчанию, как описано выше.

Я использую

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

связанная тема: как всегда использовать rgrep с цветом     

ответ дан mnono 02.01.2015 в 14:58
источник
2

Обновление 2:

Эта строка команд с использованием find и grep устраняет проблему:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> для цветного вывода:

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

Пример:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

Пример, приведенный ниже:

Обновление 1:

Вы можете попробовать следующий код; как функция в .bashrc или .bash_aliases или в скрипте:

wherein () 
{ 
    for i in $(find "" -type f 2> /dev/null);
    do
        if grep --color=auto -i "" "$i" 2> /dev/null; then
            echo -e "3[0;32mFound in: $i 3[0m\n";
        fi;
    done
}

Использование: wherein /path/to/search/in/ searchkeyword

Пример:

$ wherein ~/Documents/ "hello world"

(Примечание. Как было предложено в комментариях ниже @enzotib, это не работает с файлами / каталогами, включая пробелы в их именах.)

Оригинальное сообщение

Чтобы найти строку и вывести только эту строку со строкой поиска:

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

например:.

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

Чтобы отобразить имя файла, содержащее строку поиска:

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

например:.

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;
    
ответ дан precise 25.01.2014 в 12:11
источник
1

Я делаю это с помощью xargs, очень недооцененной команды

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

find ./ дает вам рекурсивный список всех файлов в текущей папке то вы передаете его в xargs, который выполняет команду grep для каждого из этих файлов.

    
ответ дан deadprogrammer 01.08.2011 в 17:30
источник
0

Я знаю, что здесь есть много ответов, но вот альтернатива, если вы хотите добавить другие ограничения при поиске файлов:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

Это работает, потому что grep вернет 0, если он найдет результат, 1 в противном случае. Например, вы можете найти файлы размером 1 МБ и , содержащие что-то:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Для нескольких требований вы, вероятно, захотите использовать флаг оптимизатора -O , который существует в GNU grep.

    
ответ дан Ztyx 11.03.2015 в 14:56
источник
0

Скрипт (find-in-code) для поиска в C, CPP-коде:

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n ""

Использование:

find-in-code "search string"
    
ответ дан nvd 11.06.2015 в 18:49
источник

Ознакомьтесь с другими вопросами по меткам