Сначала вы можете использовать более быструю команду, чтобы найти правильный номер. Мои тесты показывают, что find. -maxdepth 1 -type f -not -name '.*' | wc -l
быстрее, чемls -l | grep '^-' | wc -l
(примерно на 4 :3 ). Если вам также нужны скрытые файлы, вы должны использовать ls -a
или пропустить часть -not -name '.*'
с помощью find.
Далее вам не нужно считать файлы дважды, а вместо этого сохранить результат в переменной и использовать его повторно:
$(count=$(find. -maxdepth 1 -type f -not -name '.*' | wc -l)
if [[ "$count" -eq 1 ]]; then
echo "1 file"
else
echo "$count files"
fi)
Как видите, вы должны использовать одну подоболочку, иначе переменная не будет доступна для второй команды. Я также использовал специфичный для bash [[... ]]
вместо [... ]
здесь. В целом это лучшее решение.
Наконец, вы также можете использовать переменную Bash $PROMPT_COMMAND
для выполнения некоторого кода непосредственно перед выводом приглашения $PS1
. Таким образом, вам не нужно хранить весь код в переменной $PS1
. Однако переменная $count
будет глобальной . Это может выглядеть так:
function count_files () {
__count=$(find. -maxdepth 1 -type f -not -name '.*' | wc -l)
if [[ "$__count" -eq 1 ]]; then
__plural=
else
__plural=s
fi
}
PROMPT_COMMAND=count_files
PS1='other stuff $__count file$__plural more stuff'
Не знаю, какой из этих шагов вы бы посчитали упрощением:)
РЕДАКТИРОВАТЬ
Я только что нашел эту ветку SO . Его можно использовать для подсчета таких файлов
function count_files () {
local name
__count=0
for name in *; do
[[ -f "$name" ]] && ((__count++))
done
# like above...
}
Скорость составляет около 1 :13 по сравнению с версией find. Это мужественно, потому что он запускает меньше процессов (по той же причине, что версия find быстрее, чем версия ls ). У протектора есть и другие решения с extglob. Все зависит от вопроса, нужны ли вам файлы или также ссылки на файлы или еще что-то. Опять же, код стал быстрее, но теперь выглядит более сложным, так к какому «простому» вы стремитесь?
РЕДАКТИРОВАТЬ 2
Обратите внимание, хотя в комментариях я сказал, что накладные расходы на запуск процесса могут быть лишь небольшими по сравнению с накладными расходами на сортировку, когда вам нужно сортировать множество файлов, для меня это начинает показывать, если я запускаю код в /usr/bin/
, содержащий около 2500 файлов.
Нет возможности сделать это с помощью одного вызова rsync
, но вы можете имитировать это поведение, запустив rsync
без--delete
(или --delete-after
), затем выполните свою команду и запустите ту же команду rsync
в этот раз. время с опцией --delete
потом.
Пример:
rsync -avh src/ dest && command && rsync -avh --delete src/ dest