Это :r filename
является самым коротким для целых файлов. Если Вы хотите только еще один небольшие части, я всегда перехожу к исходному файлу и использованию "a57Y
"b12Y
скопировать определенные строки в регистры (регистры "a
и "b
в этих примерах), с которым я могу получить "ap
и "bp
в целевом файле.
С GNU или OpenBSD grep
:
grep -L "string" ./* | grep -c /
Вот совместимый POSIX путь, в случае, если Вы не имеете grep -L
:
for file in *; do
awk '/string/ { found=1; exit } END{ if(!found) { printf "x" } }' < "$file"
done | wc -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
и 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\""
set -- *
, использовать $#
и цикл с for i do ...
. Вы не можете использовать wc -l
для подсчета файлов как, имен файлов могут быть сделаны из нескольких строк.
– Stéphane Chazelas
08.01.2014, 14:47
] С zsh
:
( arr=(./*(.N^e_'grep -q PATTERN $REPLY'_)); print ${#arr}; )
Это сохраняет имена файлов, которые не содержат ШАБЛОН
, в массив и возвращает количество элементов в массиве. Он использует квалификаторы glob : .
выбирает только обычные файлы (добавьте D
, чтобы включить скрытые файлы), N
включает нулевой глобус
и инвертированный ( ^
) e
строка: ^ e_'grep -q ШАБЛОН $ REPLY '_
далее отменяет выбор имен файлов, для которых код оболочки в кавычках возвращает истина
.