
Можно ли получить надежную шкалу прогресса (или просто надежную информацию о том, сколько времени это займет) при выполнении updatedb
?
решение1
Это неэффективное решение, но не такое плохое, как повторный цикл.
Количество обработанных файлов updatedb
равно:
updatedb -v | wc -l
или примерно равно:
find / -mount | wc -l
Мы не можем использовать эти команды для получения числа, поскольку это приведет к двойному циклу.
Но мы можем использовать количество используемых инодов, которое примерно одинаково:
df -i | grep '/$' | awk '{print $3}'
Имея это значение, мы можем посчитать, как далеко мы продвинулись за время updatedb -v
выполнения команды:
count=$(df -i | grep '/$' | awk '{print $3}')
sudo updatedb -v | while read
do
printf "%3d\r" $((100 * (++i) / count))
done
Это очень неэффективно, поскольку printf
вызывается для каждой строки в выводе updatedb -v
. Лучше, если мы будем вызывать printf
только для некоторых строк.
count=$(df -i | grep '/$' | awk '{print $3}')
sudo updatedb -v | while read
do
if (( ++i % (count/20) == 0 )); then
printf "%3d\r" $((100 * i / count))
fi
done
решение2
Нет, такой опции нет и быть не может.
Если вам нужно это измерить, вы должны сначала узнать, сколько файлов присутствует в вашей системе, это означает, что нужно дважды все перебрать, это может быть медленно.
Одним из наглядных примеров является то, что если вы извлекаете исходный код ядра с помощью file-roller
, это происходит медленнее, чем делать то же самое tar
напрямую, поскольку file-roller сначала должен извлечь все файлы (в противном случае индикатор выполнения может отображаться неправильно), и вам приходится ждать некоторое время, прежде чем процесс извлечения фактически начнется.