4

У меня есть следующая команда

find /var -type f -exec grep "param1" {} \; -print

С помощью этой команды я могу найти строку param1 в любом файле в /var, но это занимает очень много времени.

Мне нужна еще одна возможность найти строку в файле, но гораздо быстрее, чем мой пример

5 ответов5

5

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

grep -R "param1" /var/*
1

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

я сомневаюсь, что вы хотите пойти по этому пути, но просто чтобы дать вам другой вариант :)

1

Здесь есть несколько факторов:

Во-первых, используя -exec , find создает новый процесс для grep для каждого найденного файла.

Это можно сделать либо с помощью xargs, как в ответе Фелипе Альвареса (об этом я писал в блоге 5+ лет назад), либо с помощью -exec grep param1 {} + (обратите внимание на + вместо \;). При использовании + , «командная строка строится путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество подходящих файлов» (из справочной страницы поиска)

Во-вторых, количество и размер файлов в /var потенциально очень велики.

Можете ли вы добавить параметры в дополнение к -type f чтобы ограничить количество файлов, которые вы ищете. find есть варианты ограничения по времени, владельцу, шаблону имени и т. д. Например, вы можете сделать:

find /var -type f -name "access*log" -mtime -7 -exec grep param1 {} +

Это найдет файлы, измененные за последние семь дней с именами, начинающимися с "access" и заканчивающимися "log". Только те соответствующие файлы будут частью exec/grep.

0

Я советую использовать:

grep -RInis "param1" /var

Для более подробной информации смотрите

man grep

Если скорость имеет такое значение, вы можете рассмотреть fgrep, который может оказаться не быстрым в зависимости от реализации.

0

найти ... [бла] ..... -print0 | xargs -0 grep -e "регулярное выражение"

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