Первый способ упростить скрипт — это сохранить количество файлов в переменной, чтобы вам не приходилось его пересчитывать.
Другие способы узнать количество файлов в текущем каталоге:
n=$(ls -l | grep -c ^-)
Здесь упрощение заключается в использовании опции -c
команды grep для подсчета совпадений. Существует риск ошибочного подсчета совпадений при анализе вывода ls , если есть файл с именем $'some\n-file'
, который якобы ставит дефис в начале строки.
n=$(stat -c %F -- * | grep -c 'regular.*file')
.*
в grep учитывает совпадения как «обычный файл», так и «обычный пустой файл». Команда stat выводит тип каждого файла, а глобус оболочки *
позволяет избежать проблем с ls
.
Если вы знакомы с bash, но слышали о zsh и его мощном синтаксисе подстановки имен файлов , вы можете:
n=$(zsh -c 'a=( *(.) ); echo ${#a}')
Где мы создаем массив с именем a
, который заполняется списком файлов *
, отфильтрованных только «обычными файлами» с .
.
Чтобы правильно напечатать множественное число, рассмотрим оператор case:
case $n in
(1) printf "1 file";;
(*) printf "$n files";;
esac
Оператор case обеспечивает большую гибкость, если вы хотите напечатать разные сообщения для разного количества файлов, например :"Нет файлов!".
Проще говоря, рассмотрим условное:
[[ $n == 1 ]] && printf "1 file" || printf "$n files"
Наконец-то сошлись на предложении стилдрайвера:
n=$( files=(*); dirs=(*/); echo $(( ${#files[@]} - ${#dirs[@]} )))
printf "%d file%s" "$n" "$(test "$n" -ne 1 && echo s)"
Это присваивает значениеn
(в конечном итоге )путем открытия подстановки команд; внутри этой временной подстановки команд я создаю два массива:files
для всего и dirs
только для каталогов. Последним действием подстановки команд является сообщение о разнице между ними. Затем printf
выводит количество файлов вместе с соответствующим суффиксом множественного числа.
Здесь используются все настройки, которые у вас есть для dotglob
; если вы хотите принудительно подсчитать (или пропустить )точечные -файлы,затем вы должны установить или отключить dotglob
внутри подстановки команды:
n=$( files=(*); dirs=(*/); echo $(( ${#files[@]} - ${#dirs[@]} )))
n=$(shopt -s dotglob;
files=(*); dirs=(*/); echo $(( ${#files[@]} - ${#dirs[@]} )))
n=$(shopt -u dotglob;
files=(*); dirs=(*/); echo $(( ${#files[@]} - ${#dirs[@]} )))
Решение найдено. Fedora из соображений безопасности, в последнем выпуске samba (4.10,4.11 )примените патч, чтобы полностью удалить неуверенность в шифровании. Даже последний релиз керберос (1.18 )убрал это шифрование, и теперь патч вроде бы в дереве последних исходников самбы (4.12rc)