Поиск многих файлов для строки в Linux

Вы могли сделать развертку ping своих сетей и затем сравнить это с количеством арендных договоров DHCP, розданных Вашим сервером DHCP.

У Вас должно быть общее представление о количестве статических устройств (интерфейсы маршрутизатора и принтеры, возможно), который скосит это число немного, но это должно быть быстрым и точным способом определить их через несколько сетей.

5
задан 29 June 2009 в 13:05
9 ответов

Вы могли использовать grep:

grep -rn 'classname' /path/to/source

Это также распечатает номер строки рядом с каждым соответствием.

Нечувствительный к регистру:

grep -rin 'classname' /path/to/source

Ищите нерекурсивно во всех cpp файлах:

grep -n 'classname' /path/to/source/*.cpp
8
ответ дан 3 December 2019 в 01:00

Все вышеупомянутые ответы будут работать отлично, но могут вызвать ложные положительные стороны, если у Вас будет строка в больше, чем просто исходном коде. Скажите, что Вы ищете, где Вы используете класс FooBar в проекте Java, можно искать все файлы, названные *.java и grep просто они.

# grep "FooBar" -Hn $(find -name "*.java")

Раздел, промежуточный $ (), расширится до вывода той команды.-H распечатывает имя файла. Это - значение по умолчанию, где существует больше чем одно имя файла, но мы явно добавляем его здесь в случае, если расширение только возвращает одно имя файла.-n печатает номер строки соответствия.

Это будет работать на маленькие проекты, но если Вы имеете дело с большим проектом, там потенциал для находки для расширения до строки дольше, чем предел командной строки. Поэтому более безопасно использовать:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn 

xargs возьмет вход из стандарта в и разделит его так, он соответствует на командной строке, выполняя команду многократно при необходимости.-print0 и-0 требуются, чтобы иметь дело с файлами с пробелами на их имя.

Можно также искать весь filesnames с соответствием в использовании:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l

-l просто отобразит имя файла и прекратит смотреть в конкретном файле, как только это находит соответствие.

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

(Я знаю, что Вы искали определение класса, но в Java класс будет определен в файле с тем же именем как класс. При выполнении cpp Вы могли бы сделать что-то как:

# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
  xargs -0 egrep "class\s+FooBar" -Hn 
4
ответ дан 3 December 2019 в 01:00

Для поиска исходного кода я нашел, что ack (betterthangrep.com), для заключения в кавычки маркетинга, лучше, чем grep. Его вывод легче считать, и он сделает много материала автоволшебно, как игнорирование нефайлов исходного кода: каталоги VCS (например, CVS и .svn), файлы резервных копий.

2
ответ дан 3 December 2019 в 01:00

ack лучше для поиска исходных кодов, поскольку он уже распознает часть самого популярного расширения файла (c, жемчуг, и т.д.). Это с такой скоростью, как grep и значением по умолчанию, игнорирующим весь Ваш артефакт управления версиями. Например, если Вы хотите искать некоторый исходный код жемчуга шаблона, Вы могли бы использовать

ack --perl pattern

вместо

grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)
2
ответ дан 3 December 2019 в 01:00
grep -r string *

находит все файлы, содержащие символы "строка" во всех (нескрытых) файлах в текущем каталоге и всех подкаталогах рекурсивно. Можно использовать обычный regexes для настройки строки. Посмотрите grep информацию/страницы справочника для большего количества опций.

0
ответ дан 3 December 2019 в 01:00

Уже отвеченный (я думаю, что это - то, что Вы ищете) на этом сообщении serverfault:

Рекурсивный текстовый поиск с grep и шаблонами файла

0
ответ дан 3 December 2019 в 01:00

это - что-то, что я использую много так, я вставил две функции удара мой .bashrc
Сначала каждый делает рекурсивный поиск текста в именах файлов.
Второй сделает рекурсивный поиск текста в файлах, возвращая имена файлов файлов то соответствие.

ff () {
        find . -name "*$@*" -print; 
}


fff () {
    find . -type f -print0 | xargs -0 grep -l $@
}

использование в качестве примера:

[lunix@godzilla ~/tmp]$ ff foo
./slideshow/foo
./slideshow/velocity_puppet_workshop_2009/repo/modules/foo

[lunix@godzilla ~/tmp/test]$ fff  commodo
./file2
[lunix@godzilla ~/tmp/test]$ ll
total 16K
drwxr-xr-x 2 lunix lunix 4.0K 2009-06-29 23:01 .
drwxr-xr-x 4 lunix lunix 4.0K 2009-06-29 22:57 ..
-rw-r--r-- 1 lunix lunix 1.3K 2009-06-29 22:59 file1
-rw-r--r-- 1 lunix lunix 1.7K 2009-06-29 23:00 file2
0
ответ дан 3 December 2019 в 01:00

grep-rn * это будет работать!!

-1
ответ дан 3 December 2019 в 01:00

Это классическая находка + должностное лицо могло также быть удобно:

find /path/to/ -type f -exec grep -i 'string' {} \;
0
ответ дан 3 December 2019 в 01:00

Теги

Похожие вопросы