LINUX.ORG.RU

Подсчитать количество файлов и количество вхождений строки в них

 


0

2

Добрый день. Подскажите, пожалуйста. Нужно рекурсивно обойти все директории от текущей и найти в файлах с определенным расширением определенный кусок текста, вывести кол-во вхождений и кол-во файлов, в которых эти вхождения есть.

grep -r $path $text | wc -l Про количество файлов сам сообрази.

Deleted ()

решение в 2 строчки тривиально, подождём отцов шелла с мощным однострочником

zolden ★★★★★ ()
Ответ на: комментарий от zolden

разелить ; и типо в одну строку получится

anonymous ()
Ответ на: комментарий от anonymous

это неспортивно, хочу реальной крутоты в треде

zolden ★★★★★ ()
find -name '*.ext' -exec bash -c 'let matches=0 files=0; for f; do m=$(grep -c -- your_string "$f") && (( matches += m, files++ )); done; echo "$matches match(es) in $files file(s)."' _ {} +
anonymous ()
Ответ на: комментарий от zolden

не баш, но на безрыбье деваться некуда

% { grep -c 123 /tmp/**/*.txt } >&1 > >(echo Total:$(wc -l))
/tmp/file1.txt:2
/tmp/file2.txt:1
Total:2
zolden ★★★★★ ()
Последнее исправление: zolden (всего исправлений: 1)
Ответ на: не баш, но на безрыбье деваться некуда от zolden
find ./ -name "*.ext" -type f -print | tee list | xargs cat | grep -c 'string' | tee num | xargs wc -l list 2>/dev/null

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

f1st ()
find ./ -name "*.ext" -exec grep -H -c 'string' {} +;

Вывод в виде:

/path/file1:4
/path/file2:0
/path/file3:1
anonymous ()
Ответ на: комментарий от anonymous

Ах ты читер, а количество файлов Пушкин за тебя считать будет?

Довольно этого детского сада, пора угореть по хардкору.
А что за хардкор без олдскула: emulek, ananas, sT331h0rs3, nbw, Diff

Играем в гольф, победитель забирает всё

zolden ★★★★★ ()
Ответ на: комментарий от zolden

а количество файлов Пушкин за тебя считать будет?

Элементарщина же

 ... | awk -F':' '{t+=2}; $2 > 0 {i++}; END {print "Files: "$i; print "Total entries: "$t}'
anonymous ()
perl -nE '$a{$_} = $i++ while /$PATTERN/g }{ say "$i ",~~keys %a' *.ext
Deleted ()
Ответ на: комментарий от sT331h0rs3

Лол, я и не думал, что ты настолько уныл!
Но скрывать некомпетентность под такими отмазками это вообще фу таким быть

zolden ★★★★★ ()
Ответ на: комментарий от zolden

А я знал, что ты такой петросян. Специально сюда зашёл ради твоих смешных коментариев.

sT331h0rs3 ★★★★★ ()
Ответ на: комментарий от t184256

Да не, пусть останется! Будет где-то на заднем плане сам себе радоваться, не мешает.

sT331h0rs3 ★★★★★ ()
Ответ на: комментарий от Deleted

Нужно рекурсивно обойти все директории

anonymous ()
Ответ на: комментарий от anonymous
perl -nE' code ' `find .`

P.S. Если имена файлов повторяются:

perl -nE' $i++ while /$PATTERN/g; $j++ if /$PATTERN/ }{ say "$i,$j" ' files

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.