Список всех файлов, которые соответствуют определенному регулярному выражению, вместе с количеством совпадений

На моем сервере виртуального хостинга также есть ~файл /.cpan/CPAN/MyConfig.pm. Удаление всей папки ~/.cpanпомогло мне. Для удаления /usr/share/perl5/CPAN/Config.pmтребуются привилегии root, поэтому мне это не поможет.

Этот код работает для сброса и повторного -запуска установки cpan без вывода (, извлеченного из моего скрипта sslcert cron ).

if [ -d ~/.cpan ]; then rm -fR ~/.cpan ; echo y | cpan > /dev/null 2>&1; fi

Та же строка также работала на моем настольном ПК с Ubuntu.

-1
04.03.2021, 04:44
3 ответа

Чтобы найти файлы, рекурсивно соответствующие шаблону,find PATH -name PATTERN-см. man find. Для поиска по содержимому этих файлов вы должны объединить findс grepв find … -exec grep PATTERN +. Наконец, GNU grepимеет флаг --count/-cдля подсчета количества совпадений.

$ cd "$(mktemp --directory)"
$ printf '%s\n' foo bar foo > first
$ printf '%s\n' bar foo bar > second
$ printf '%s\n' bar > third
$ find. -name '*r*' -exec grep --count foo {} +
./third:0
./first:2
0
18.03.2021, 22:27

Если вы можете быть удовлетворены ограничением регулярных выражений в стиле egrepи подсчетом только количества строк, соответствующих регулярному выражению (, а не общего количества совпадений регулярного выражения ), то вам подойдет что-то вроде этого:

$ find /directory/name -type f -print | xargs egrep -c "line[0-9]" /dev/null

(/dev/nullв конце является своего рода хаком, в случае, если xargsразбивает вывод findтаким образом, что последняя выполняемая ею команда egrepвызывается ровно с одним именем файла -, в котором В этом случае он напечатает счетчик, но не имя файла, к которому относится этот счетчик ).

Если вы хотите жить опасно и вместо этого пытаетесь использовать регулярные выражения в стиле Perl -, вы можете использовать grep -Pвместо egrep, но это может работать или не работать, в зависимости от используемой системы. это на.

0
18.03.2021, 22:27

Вы можете использовать рекурсивную версию grep. Если вам просто нужны имена файлов, вы можете сделать:

grep -rl regex *

Вы можете отправить вывод вышеуказанного через wc -l, чтобы получить количество совпадающих файлов.

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

grep -rc regex * | grep -v ":0$"
0
18.03.2021, 22:27

Теги

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