Linux 설치 시간을 일 단위로 표시하는 스크립트

Linux 설치 시간을 일 단위로 표시하는 스크립트

Age이 스크립트를 호출하는 명령을 만들고 싶습니다 .

From=$(stat / | grep "Birth" | sed 's/Birth: //g' | cut -b 2-11)
echo $From
Now=$(date)
echo $Now

그런데 계속해서 이 두 날짜를 뺍니다.

2022-05-07어떻게 그것들을 빼고 와 같은 날짜/시간과 혼동되지 않는지 확인할 수 있나요 2022-07-05? 내 말은, 지금이 몇 월이고 무슨 요일입니까?

이러한 혼란을 방지하기 위해 명령 형식을 stat좀 더 설명적으로 변경한 다음 두 날짜가 동일한 형식인지 확인한 다음 빼야 한다고 생각합니다. 하지만 어떻게 해야 할지 모르겠습니다.

답변1

이 답변은 잘못되었습니다! ! ! 차이는 초 단위로 수동으로 계산해야 합니다. 디스플레이 명령을 사용하여 date월, 현재 날짜의 일수 및 수많은 초 수만 표시합니다 1970-01-01.


나는 이렇게 할 것이다:

#!/bin/bash

d1=$(date -d "$(stat / | grep "Birth" | sed 's/Birth: //g')" +%s)
d2=$(date +%s)
date -d "@$(($d2 - $d1))" +'%m months, %d days, %H hours'

몇 초 안에 두 번 얻으세요. 이를 빼고 원하는 형식으로 표시하세요. 이 경우에는 월, 일, 시간 단위입니다. 원하는대로 변경할 수 있습니다. man date어떤 출력 형식 옵션이 있는지 확인해보세요 .

날짜 형식 YYYY-MM-DD에 대한 혼동과 관련하여 컴퓨터가 이를 YYYY-DD-MM으로 잘못 해석하는 것을 본 적이 없습니다.


muru의 의견을 바탕으로 추가됨(oneliner):

date -d "@$(($(date +%s) - $(stat / --format %W)))" +'%m months, %d days, %H hours'

@Saeed Neamati의 의견 뒤에 추가되었습니다. 아래 답변은 더 나은 솔루션을 제공합니다. 아직 100% 정확하지는 않습니다.

첫 번째 옵션 차이를 계산한 다음 해당 차이를 1970-01-01에 추가하면 1970-01-01과의 연도, 월, 일 차이를 표시할 수 있습니다. 월 길이와 윤년이 다르기 때문에 결과가 정확하지 않습니다.

seconds=$(date -d "@$(($(date +%s) - $(stat / --format %W)))" +%s)
years=$(($(date -d @$seconds +%Y) - 1970))
months=$(($(date -d @$seconds +%m) - 1))
days=$(($(date -d @$seconds +%d)))
echo $years years, $months months, $days days

두 번째 옵션 또 다른 방법은 두 날짜를 가져와서 그 차이를 계산하는 것입니다. 모든 달이 31일이 아니기 때문에 일수가 정확하지 않을 수 있습니다.

d1_year=$(date -d @$(stat / --format %W) +%Y)
d1_month=$(date -d @$(stat / --format %W) +%-m)
d1_day=$(date -d @$(stat / --format %W) +%-d)

d2_year=$(date +%Y)
d2_month=$(date +%-m)
d2_day=$(date +%-d)

years=$(($d2_year - $d1_year))
months=$(($d2_month - $d1_month))
if (( $months < 0 )); then
    months=$(($months + 12))
    years=$(($years - 1))
fi
days=$((d2_day - $d1_day))
if (( $days < 0 )); then
    days=$(($days + 31))
    months=$((months -1))
fi

echo $years years, $months months, $days days

답변2

2022-05-07은 05/07/22 또는 07/05/2022와 달리 항상 YYYY-MM-DD인 명확한 표준 날짜 형식입니다. 그러나 여기에서는 달력 날짜/시간을 구문 분석할 필요가 없으며 에포크 이후 초 단위의 원시 데이터를 얻을 수 있습니다.

GNU stat(최근에는 충분히최신 glibc 및 Linux 커널을 사용하므로 탄생 시간을 보고합니다) 및 ( Debian 및 그 파생물에서) ddiff의 명령은 다음과 같습니다.dateutilsdateutils.ddiff

ddiff -i %s -f %d "$(stat -c%W /)" now

또는 하루를 86400초로 대략적으로 계산하려면 다음을 수행합니다(86400 Unix 초이지만 일부 시간대의 DST로 인해 드문 경우지만 계산이 하루 차이가 날 수 있음).

echo "$(( ($(date +%s) - $(stat -c%W /)) / 86400 ))"

zsh 를 사용 zmodload zsh/datetime 하시거나 최신 버전을 사용하신 후 bash.$(date +%s)$EPOCHSECONDS

tsmoreutils에서 를 사용하면 타임스탬프를 구문 분석하고 일부 / 형식 -r으로 변환할 수 있습니다 . ISO-8600 형식을 포함한 여러 타임스탬프 형식을 인식하므로 출력을 약간 변환하고 UTC 시간을 가져와야 합니다. 시간대 부분이 해석되지 않을 것이라고 생각하기 때문입니다.61d25m ago166d7h agostatts

TZ=UTC0 stat -c%w / |
  sed 's/ /T/;s/ .*/Z/' |
  ts -r

또는 with find대신 GNU를 사용하여 처음부터 올바른 형식의 타임스탬프를 가져옵니다(역시 최신 버전의 findutils, glibc, Linux가 필요함).statTZ=UTC0 find / -prune -printf '%BFT%BTZ\n'

관련 정보