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

Это :r filename является самым коротким для целых файлов. Если Вы хотите только еще один небольшие части, я всегда перехожу к исходному файлу и использованию "a57Y "b12Y скопировать определенные строки в регистры (регистры "a и "b в этих примерах), с которым я могу получить "ap и "bp в целевом файле.

7
13.04.2017, 15:36
6 ответов

С GNU или OpenBSD grep:

grep -L "string" ./* | grep -c /
10
27.01.2020, 20:13

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

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

Другой 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 поскольку имена файлов могут быть сделаны из нескольких строк. Наличие ./ также избегает проблем с именами файлов, которые запускаются с - или - (который -- не работает вокруг). Обратите внимание, что это игнорирует точечные файлы.

9
27.01.2020, 20:13

Другой способ 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\""
1
27.01.2020, 20:13
  • 1
    Обратите внимание, что это возвратится 1, если не будет никакого нескрытого файла в текущем каталоге. Можно также хотеть пропустить каталоги. Другой способ считать файлы и избежать состояния состязания был бы set -- *, использовать $# и цикл с for i do .... Вы не можете использовать wc -l для подсчета файлов как, имен файлов могут быть сделаны из нескольких строк. –  Stéphane Chazelas 08.01.2014, 14:47

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

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

0
27.01.2020, 20:13

] С zsh :

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

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

0
27.01.2020, 20:13

Теги

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