Следующий сценарий достигает того, что вы хотите:
i=0
for file in *exam*
do
if [ -d "$file" ] || [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]
then
i=$((i+1))
fi
done
echo "Number of files: $i"
Он перебирает все файлы, имя которых содержит exam
, и для каждого такого файла проверяет, является ли он каталогом или содержит строку exam
, и если да, то скрипт увеличивает счетчик на единицу.
Редактировать:Вероятно, я неправильно понял ваш вопрос, и вы хотите считать каталоги и файлы отдельно. В этом случае измените сценарий на
i=0;j=0
for file in *exam*
do
if [ -d "$file" ]; then
i=$((i+1))
elif [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]; then
j=$((j+1))
fi
done
echo "Number of directories: $i"
echo "Number of regular files: $j"
Это потому, что как uniq
работает, от человека:
Note: 'uniq' does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use 'sort -u' without 'uniq'.
Итак, лучше использовать, не нужноcat
:
$ cut -d ':' -f 7 /etc/passwd | sort -u
/bin/bash
/bin/false
/bin/sync
/usr/sbin/nologin
Или одна команда
awk -F: '{ print $7 | "sort -u" }' /etc/passwd
awk -F: '!s[$7]++{print $7}' /etc/passwd
Вы должны передать отсортированный вывод в uniq
, чтобы заставить его работать.
$ cat /etc/passwd | cut -d ':' -f 7 | sort | uniq
/bin/bash
/bin/sync
/sbin/halt
/sbin/shutdown