首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个以天为单位显示linux安装时间的脚本。

一个以天为单位显示linux安装时间的脚本。
EN

Unix & Linux用户
提问于 2023-01-15 09:55:41
回答 2查看 148关注 0票数 1

我想创建一个名为Age的命令,它调用这个脚本:

代码语言:javascript
复制
From=$(stat / | grep "Birth" | sed 's/Birth: //g' | cut -b 2-11)
echo $From
Now=$(date)
echo $Now

但是,我不得不减去这两次约会。

我如何才能减去它们,并确保它不像2022-05-072022-07-05那样混乱的日期时间?我是说,哪一个月,哪个日期?

我认为我应该更改stat命令的格式,使其更具描述性,以避免这种混淆,然后确保这两个日期都是相同的格式,然后减去它们。但我找不到方法。

EN

回答 2

Unix & Linux用户

发布于 2023-01-15 10:23:49

This的答案是错的!应根据秒数手动计算差异。使用 date显示的command只显示一天的月份、日数,这是从 1970-01-01**.**到的那么多秒。

我会这样做:

代码语言:javascript
复制
#!/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 DD,我从未见过计算机会错误地将其解释为YYYY。

根据muru的评论添加(oneliner):

代码语言:javascript
复制
date -d "@$(($(date +%s) - $(stat / --format %W)))" +'%m months, %d days, %H hours'

Addition @Saeed Neamati评论。下面的答案提供了更好的解决方案。它们仍然不能百分之百正确。

First选项如果计算差异,然后将该差异添加到1970-01-01,则可以以年、月和日显示1970-01-01年之间的差异。由于月份长短不同,而且由于闰年,结果并不准确:

代码语言:javascript
复制
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

Second选项另一种方法是获取两个日期并计算它们之间的差异。日子可能不对,因为并非所有的月份都是31天:

代码语言:javascript
复制
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
票数 3
EN

Unix & Linux用户

发布于 2023-01-23 15:02:32

2022-05-07,与05/07/22或07/05/2022相反,是一种明确的标准日期格式,总是YYYY DD。但是,在这里,您不需要解析日历日期时间,您可以将原始数据作为从时代开始的几秒钟来获取。

使用GNU stat (最近够了,以及最近的glibc和Linux内核,因此它报告了出生时间)和dateutils ( Debian和衍生工具中的dateutils.ddiff)的ddiff命令:

代码语言:javascript
复制
ddiff -i %s -f %d "$(stat -c%W /)" now

或者近似地说,一天是86400秒(它们是86400 Unix秒,但由于某些时区的DST,计算可能会在极少数情况下中断一天):

代码语言:javascript
复制
echo "$(( ($(date +%s) - $(stat -c%W /)) / 86400 ))"

使用zmodload zsh/datetime后的zsh或bash的最新版本,$(date +%s)可以替换为$EPOCHSECONDS

使用ts,使用-r可以解析时间戳并将它们转换为某种61d25m ago / 166d7h ago格式。它识别了许多时间戳格式,包括ISO-8600格式,因此您需要稍微转换stat的S输出,并获得UTC时间,因为我不认为ts解释了时区部分:

代码语言:javascript
复制
TZ=UTC0 stat -c%w / |
  sed 's/ /T/;s/ .*/Z/' |
  ts -r

或者使用GNU find而不是statTZ=UTC0 find / -prune -printf '%BFT%BTZ\n'从一开始就以正确的格式获得时间戳(同样,需要一个最新版本的findutils、glibc、Linux)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/731826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档