Отображение секунд как дни/часы/минуты/секунды?

grep -rins <pattern> *

Это делает то, что Вы ищете?

В случае, если у Вас есть более сложный шаблон, например, при использовании egrep, могло бы быть полезно использовать egrep -rinos <pattern> * вместо этого.

Для дальнейшего увеличения удобочитаемости добавить --color к списку параметров. Лично, у меня есть это в моем .zshrc:

export GREP_OPTIONS="--color"
31
17.12.2011, 01:15
9 ответов

Можно использовать что-то вроде этого:

function displaytime {
  local T=$1
  local D=$((T/60/60/24))
  local H=$((T/60/60%24))
  local M=$((T/60%60))
  local S=$((T%60))
  (( $D > 0 )) && printf '%d days ' $D
  (( $H > 0 )) && printf '%d hours ' $H
  (( $M > 0 )) && printf '%d minutes ' $M
  (( $D > 0 || $H > 0 || $M > 0 )) && printf 'and '
  printf '%d seconds\n' $S
}

Примеры:

$ displaytime 11617
3 hours 13 minutes and 37 seconds
$ displaytime 42
42 seconds
$ displaytime 666
11 minutes and 6 seconds
42
27.01.2020, 19:37

date --date '@1005454800' дает Вам Sun Nov 11 00:00:00 EST 2001, который является спустя 1005454800 секунд после эпохи Unix. Можно отформатировать это с датой +FORMAT опция.

-2
27.01.2020, 19:37
  • 1
    Это - дата, не продолжительность, о которой спрашивал вопрос. –  Gilles 'SO- stop being evil' 18.12.2011, 01:02

Я модифицировал функцию отображения приведенного выше ... следующим образом:

seconds2time ()
{
   T=$1
   D=$((T/60/60/24))
   H=$((T/60/60%24))
   M=$((T/60%60))
   S=$((T%60))

   if [[ ${D} != 0 ]]
   then
      printf '%d days %02d:%02d:%02d' $D $H $M $S
   else
      printf '%02d:%02d:%02d' $H $M $S
   fi
}

Потому что я всегда хочу видеть HH: MM: SS, даже если они нули.

2
27.01.2020, 19:37

Кредит идет в Stéphane Gimenez , но если кто-то хотел бы отобразить секунды, только если период меньше минуты, вот моя модифицированная версия, которую я использую (также с фиксированным Плюрализация):

converts()
{
    local t=$1

    local d=$((t/60/60/24))
    local h=$((t/60/60%24))
    local m=$((t/60%60))
    local s=$((t%60))

    if [[ $d > 0 ]]; then
            [[ $d = 1 ]] && echo -n "$d day " || echo -n "$d days "
    fi
    if [[ $h > 0 ]]; then
            [[ $h = 1 ]] && echo -n "$h hour " || echo -n "$h hours "
    fi
    if [[ $m > 0 ]]; then
            [[ $m = 1 ]] && echo -n "$m minute " || echo -n "$m minutes "
    fi
    if [[ $d = 0 && $h = 0 && $m = 0 ]]; then
            [[ $s = 1 ]] && echo -n "$s second" || echo -n "$s seconds"
    fi  
    echo
}

Альтернативный пример в posix:

converts(){
    t=$1

    d=$((t/60/60/24))
    h=$((t/60/60%24))
    m=$((t/60%60))
    s=$((t%60))

    if [ $d -gt 0 ]; then
            [ $d = 1 ] && printf "%d day " $d || printf "%d days " $d
    fi
    if [ $h -gt 0 ]; then
            [ $h = 1 ] && printf "%d hour " $h || printf "%d hours " $h
    fi
    if [ $m -gt 0 ]; then
            [ $m = 1 ] && printf "%d minute " $m || printf "%d minutes " $m
    fi
    if [ $d = 0 ] && [ $h = 0 ] && [ $m = 0 ]; then
            [ $s = 1 ] && printf "%d second" $s || printf "%d seconds" $s
    fi
    printf '\n'
}
7
27.01.2020, 19:37

Я бы сделал это так:

$ seconds=123456789; echo $((seconds/86400))" days "$(date -d "1970-01-01 + $seconds seconds" "+%H hours %M minutes %S seconds")
1428 days 21 hours 33 minutes 09 seconds
$

Вот один лайнер выше, разбитый, чтобы его было легче понять:

$ seconds=123456789
$ echo $((seconds/86400))" days"\
     $(date -d "1970-01-01 + $seconds seconds" "+%H hours %M minutes %S seconds")

Выше я повторяю вывод другой команды, которая выполняется внутри подкоманды $ (...) . Эта подкоманда делает это, вычисляя количество дней (секунд / 86400), а затем используя команду date в другой подкоманде $ (date -d ...) , чтобы сгенерировать часы, минуты и секунды для заданного количества секунд.

3
27.01.2020, 19:37

Самый простой и чистый способ - это один лайнер (здесь предполагается, что GNU дата ):

Если количество секунд равно, скажите:

seconds=123456789 # as in one of the answers above

eval "echo $(date -ud "@$seconds" +'$((%s/3600/24)) days %H hours %M minutes %S seconds')"

- -> вывод: 1428 дней 21 час 33 минуты 09 секунд

14
27.01.2020, 19:37

Вот один

secs=378444
echo $(($secs/86400))d $(($(($secs - $secs/86400*86400))/3600))h:$(($(($secs - $secs/86400*86400))%3600/60))m:$(($(($secs - $secs/86400*86400))%60))s

Выход:

4d 9h:7m:24s
-1
27.01.2020, 19:37

Я основываюсь на ответе Атти, который мне понравился как идея.

Вы можете сделать это с помощью встроенной команды bash printf, которая будет принимать секунды с начала эпохи в качестве аргумента. Не нужно разветвляться для запуска date.

Вы должны установить часовой пояс на UTC для printf, потому что он форматирует время в вашем местном часовом поясе, и вы получите неправильный ответ, если вы не в формате UTC.

$ seconds=123456789
$ TZ=UTC printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1428 days 21 hours 33 minutes 09 seconds

По моему местному времени (, которое сейчас NZDT -+1300 ), ответ будет неверным, если я не установлю часовой пояс

$ seconds=123456789
$ printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1428 days 09 hours 33 minutes 09 seconds

С настройкой часового пояса и без нее

$ seconds=$(( 3600 * 25))
$ printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1 days 13 hours 00 minutes 00 seconds

$ TZ=UTC printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1 days 01 hours 00 minutes 00 seconds
2
27.01.2020, 19:37

Основываясь на ответе Стефана Хименеса, но являясь альтернативой ответу Димира:

Так как printf уже запущен, можно также использовать %s и pass is the s (или нет )для множественного числа при необходимости:

displaytime() {
  local T=$1
  local D=$((T/60/60/24))
  local H=$((T/60/60%24))
  local M=$((T/60%60))
  local S=$((T%60))
  (( $D > 0 )) && printf '%d day%s ' $D $( (( $D > 1 )) && echo s)
  (( $H > 0 )) && printf '%d hour%s ' $H $( (( $H > 1 )) && echo s)
  (( $M > 0 )) && printf '%d minute%s ' $M $( (( $M > 1 )) && echo s)
  (( $D > 0 || $H > 0 || $M > 0 )) && printf 'and '
  printf '%d second%s\n' $S $( (( $S != 1 )) && echo s)
}
0
28.04.2021, 19:33

Теги

Похожие вопросы