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

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

Можно ли инвертировать это, найдя количество файлов, не содержащих целевую строку? Я попробовал добавить параметр -v , но это, похоже, не приводит к правильному результату.

6 Solutions collect form web for “Количество файлов, не содержащих заданную строку”

С GNU или OpenBSD grep :

 grep -L "string" ./* | grep -c / 

Другой способ POSIX:

 c=0 for f in *; do [ -d "$f" ] && continue { grep -q string || c=$(($c + 1)); } < "$f" done echo "$c" 

Перенаправляя группу команд вместо grep одиночку, мы не учитываем как 1 файлы, которые мы не можем открыть (например, файлы, для которых у нас нет разрешения на чтение, или * если в текущем каталоге нет скрытого файла).

С GNU grep эквивалент будет:

 grep -d skip -L foo ./* | grep -c / 

Обратите внимание: вы не можете использовать wc -l поскольку имена файлов могут быть сделаны из нескольких строк. Наличие ./ также позволяет избежать проблем с именами файлов, которые начинаются с - или есть - (которые -- не работают). Обратите внимание, что он игнорирует файлы точек.

Вот как POSIX-совместимый способ, если у вас нет grep -L :

 for file in *; do awk '/string/ { found=1; exit } END{ if(!found) { printf "x" } }' < "$file" done | wc -c 

Другой способ POSIX, использующий только grep и wc :

 COUNT_FILES=0 for i in *;do COUNT_FILES=$((COUNT_FILES+1));done MATCHES=$(grep -l "string" * | wc -l) NON_MATCHES=$((COUNT_FILES - MATCHES)) echo "There are $NON_MATCHES files not matching \"string\"" 

В зависимости от того, сколько файлов вы хотите найти, это хороший совет, чтобы взглянуть на ack-grep . Причина, потому что ack-grep намного быстрее, чем good'ol grep и CLI почти идентичен.

ack-grep -Lur "some string" * | wc -l

С zsh :

 ( arr=(./*(.N^e_'grep -q PATTERN $REPLY'_)); print ${#arr}; ) 

Это сохраняет имена файлов, которые не содержат PATTERN в массив и возвращает количество элементов в массиве. Он использует квалификаторы glob :. выбирает только обычные файлы (добавляет D для включения скрытых файлов), N включает null glob и строку с отрицанием ( ^ ) e : ^e_'grep -q PATTERN $REPLY'_ далее ^e_'grep -q PATTERN $REPLY'_ имена файлов, для которых код оболочки между кавычки true .

  • Проблема с grep -o regex
  • Что я делаю неправильно, пытаясь написать сценарий bash, который возвращает номер следующего доступного порта?
  • Фильтрация путей на определенную глубину
  • Как использовать grep, sort и uniq для создания трех полей вывода
  • Grep и regex: Почему следующее возвращает только определенную часть?
  • Ошибка grep: операнд оператора повторения недействителен
  • Задача сравнения регулярных выражений / шаблонов для извлечения данных
  • найти совпадающие URL-адреса в строке, а затем сократить их до имени домена
  • grep с большим количеством файлов, который содержит много строк?
  • Регулярное выражение ^ $ не работает в UNIX, используя команду grep
  • Удалить имя файла при рекурсивном подсчете числа вхождений шаблона
  • Косая черта, не обнаруженная в команде «grep»
  • Interesting Posts

    fuse.sshfs: не может использовать `SHOPT = val` в / etc / fstab

    Как отслеживать изменения ресурсов (inodes, blocks) при запуске программы

    Значение <в пути к файлу в файле конфигурации dovecot?

    В udev, какие события устройства соответствуют ACTION == "change"?

    Как показать диалог Java, когда cron запускает программу Java?

    Применение и привязка всех настроек / двоичных файлов одного пользователя к другому пользователю в Linux

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

    Почему «echo f» в случае очистки таблицы conntrack не работает на debian?

    В чем разница между ошибкой «не найденной» и ошибкой «команда не найдена» – это то же самое?

    Создать каталог, если zip-архив содержит несколько файлов

    MySQL Workbench Не удается запустить диспетчер туннелей SSH

    Xorg: несколько клавиатур, одна конфигурация

    Как разрешить tee распечатывать все дескрипторы файлов на экране, но только сохранить stdout в файл?

    уровни сжатия gz и xz

    Тар список файлов, которые не все существуют

    Linux и Unix - лучшая ОС в мире.