Количество файлов, содержащих данную строку

19

Как я могу посчитать количество файлов (в каталоге), содержащих данную строку, как ввод в bash / sh?

морская звезда
источник

Ответы:

30

grep -l "string" * | wc -l будет искать «строку» в содержимом всех файлов в рабочем каталоге и сообщит вам, сколько совпадений.

волк
источник
1
Это не будет работать, если в каталоге много файлов, будет выдано сообщение об ошибке «zsh: список аргументов слишком длинный: grep». Есть идеи как избавиться от этого?
1
@ user16142 grep каталог вместо файлов: grep -lr "string" directory | wc -lесли вы не хотите рекурсивного поиска, вы можете использовать опцию find with maxdepth: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lобратите внимание, что этот второй параметр медленнее, чем grep.
Агаргара
9

grepПараметр s -lбудет выводить только имена файлов, которые совпадают $PATTERN, wcможет посчитать их потом.

grep -l "$PATTERN" * | wc -l
шутник
источник
спасибо, но было интересно с шаблоном в файле ... извините за неоднозначный вопрос
Если так, примите ответ Вольфа.
wag
3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Пояснение: это ищет количество файлов, которые имеют "pattern_to_look_for" в их содержании, а не в их именах файлов (как ответ Wag). По твоему вопросу сложно сказать, что ты ищешь.

Ян Перссон
источник
Но чего-то не хватает? потому что не работает
Если вы ищете строку утка, вы должны написать как / Duck / в Awk. Ты это делаешь?
Ян Перссон
да, вывод: awk: ошибка чтения (это каталог)
Ответ волка даст вам дубликаты. Если в одном из файлов есть несколько вхождений искомой строки, это будет считаться дополнительным совпадением.
Ян Перссон
Что ж, если у вас есть каталоги в папке, вы должны сделать некоторые дополнительные вещи, такие как замена звезды на что-то вроде этого find . ! -name . -prune -type f(не пропустите галочки). Эта команда перечисляет только файлы в папке.
Ян Перссон
2

Это работает в Bash с любым именем файла:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Объяснение:

  • grep-ZОпция 's печатает каждый результат с ␀-байтовым разделителем. Этот символ не может быть частью имени файла, поэтому мы можем просто посчитать количество разделителей, чтобы получить количество файлов.
  • Чтобы избавиться от других символов в выводе, мы просто удаляем все, кроме ␀ байтов, используя tr.
  • Затем просто посчитайте символы с wc.
l0b0
источник