LINUX.ORG.RU

progress 0.0a


0

0

Наваял вот такую полезную для себя хрень: отслеживать прогресс времени для больших интервалов (прогресс а-ля wget). Давно хотел. Мне часто интересно проследить ход времени (сколько прошло, сколько осталось) с такой-то даты по такую-то, например с 20040111 по 20040511. Кто то может захотеть отследить прогресс года (20040101..20050101) или месяца. Всего-то около 30 строчек bash. Из редкого требует bc (для вещественной арифметики). Прога автоматом растянет прогресс на весь экран. Процесс инсталяции: echo "/path/to/progress" >> ~/.bash_profile :)) Наверняка еще захотите поменять первую и конечную даты (D0 и D1), их можно либо в скриптике поменять, либо через env передавать. Потому как хардкоднутые даты по умолчанию мои и наврядли имеют для кого-то смысл :)

Пример вывода (при D0=20040101, D1=20050101, TODAY=20041001, ширина консоли: 80):

20040101>==============================================................<20
050101

#!/bin/bash
                                                                                                                             
D0="${D0:-20040111}"
D1="${D1:-20040511}"
                                                                                                                             
strlen() { echo -n "$1" | awk '{ print length }'; }
                                                                                                                             
D0_NORM=$(date -d "$D0" +%s)
D1_NORM=$(date -d "$D1" +%s)
TODAY_NORM=$(date -d $(date +%Y%m%d) +%s)
# used for debugging
#TODAY_NORM=$(date -d "$(date -d "$D0") + 10 days" +%s)
#TODAY_NORM=$(date -d "$(date -d "$D1") + 1 days ago" +%s)
                                                                                                                             
# sanity checks
if [ "$D0_NORM" -gt "$D1_NORM" ]; then D0_NORM=$D1_NORM; fi
if [ "$TODAY_NORM" -lt "$D0_NORM" -o "$TODAY_NORM" -gt "$D1_NORM" ]; then TODAY_NORM=$D1_NORM; fi
                                                                                                                             
COLS=$(stty size | cut -d' ' -f2)
AVAIL_COLS=$[$COLS-(`strlen "$D0"`+1+`strlen "$D1"`+1)]
DAYS_DELTA=$[($D1_NORM-$D0_NORM)/(60*60*24)]
PROGRESS_DAYS=$[($TODAY_NORM-$D0_NORM)/(60*60*24)]
DAYS_PER_COL=$(echo "${DAYS_DELTA}.0/$AVAIL_COLS" | bc -l)
PROGRESS_COLS=$(echo "$PROGRESS_DAYS/$DAYS_PER_COL" | bc)
                                                                                                                             
echo -n "$D0>"
for i in `seq 1 $PROGRESS_COLS`; do
        echo -n "="
done
for i in `seq 1 $[$AVAIL_COLS-$PROGRESS_COLS]`; do
        echo -n "."
done
echo -n "<$D1"

Fuck this shit. Вот что было до кода:

Наваял вот такую полезную для себя хрень: отслеживать прогресс времени для больших интервалов (прогресс а-ля wget). Давно хотел. Мне часто интересно проследить ход времени (сколько прошло, сколько осталось) с такой-то даты по такую-то, например с 20040111 по 20040511. Кто то может захотеть отследить прогресс года (20040101..20050101) или месяца. Всего-то около 30 строчек bash. Из редкого требует bc (для вещественной арифметики). Прога автоматом растянет прогресс на весь экран. Процесс инсталяции: echo "/path/to/progress" >> ~/.bash_profile ) Наверняка еще захотите поменять первую и конечную даты (D0 и D1), их можно либо в скриптике поменять, либо через env передавать. Потому как хардкоднутые даты по умолчанию мои и наврядли имеют для кого-то смысл )

Пример вывода (при D0=20040101, D1=20050101, TODAY=20041001, ширина консоли: 80):

20040101>==============================================................<20 050101

rihad
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.