Linuxのインストール時間を日単位で表示するスクリプト

Linuxのインストール時間を日単位で表示するスクリプト

Ageこのスクリプトを呼び出すコマンドを作成したいと思います。

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

ところで、引き続きこの2つの日付を差し引きます。

2022-05-07どのようにそれらを差し引くのと同じ日付/時間と混同されないかを確認できますか2022-07-05?私の言葉は、今が何月で、何曜日ですか?

この混乱を避けるために、コマンド形式をstatもう少し説明的に変更してから、2つの日付が同じ形式であることを確認してから減算する必要があると思います。しかし、どうすればいいのかわかりません。

答え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'

数秒で2回取得します。これを除いて希望の形式で表示してください。この場合、月、日、時間単位です。好きなように変更できます。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

2番目のオプション 別の方法は、2つの日付を取得してその差を計算することです。すべての月が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

または、1日を86400秒でおおよその計算するには、次のようにします(86400 Unix秒ですが、一部のタイムゾーンのDSTのためにまれですが、計算に1日の差が生じる可能性があります)。

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

またはwithfindの代わりにGNUを使用して、最初から正しい形式のタイムスタンプを取得します(やはり最新バージョンのfindutils、glibc、Linuxが必要です)。statTZ=UTC0 find / -prune -printf '%BFT%BTZ\n'

関連情報