如何在Bash脚本中解码Seagate的硬盘日期代码

时间:2014-09-23 09:59:32

标签: bash

Seagate个硬盘驱动器显示代码而不是生产日期。代码描述为here,并且可以使用在线解码器here

简而言之,它是YYWWDYYWD形式的4位或5位数字,其中:

  • YY是年份,00是1999年
  • WWW是从1开始的周数
  • D是从1开始的一周
  • 第1周于所述年份的7月的第一个星期六开始

实施例

  • 06212表示2005年11月20日星期日
  • 0051指1999年7月31日星期六

如何在bash脚本中解码?

3 个答案:

答案 0 :(得分:3)

这就是我所做的,它应该有效:

#!/bin/bash

DATE=$1
REGEX="^(..)(..?)(.)$"

[[ $DATE =~ $REGEX ]]
YEAR=$(( ${BASH_REMATCH[1]} + 1999 ))
WEEK=$(( ${BASH_REMATCH[2]} - 1))
DAYOFWEEK=$(( ${BASH_REMATCH[3]} - 1))


OFFSET=$(( 6 - $(date -d "$YEAR-07-01" +%u) ))
DATEOFFIRSTSATURDAY=$(date -d "$YEAR-7-01 $OFFSET days" +%d)
FINALDATE=`date -d  "$YEAR-07-$DATEOFFIRSTSATURDAY $WEEK weeks $DAYOFWEEK days"`

echo $FINALDATE

它适用于上面给出的两个日期...... 如果要自定义日期输出,请在FINALDATe分配的末尾添加格式字符串。

答案 1 :(得分:1)

这是一个简短的脚本,需要两个参数:$1是要转换的代码,$2是可选格式(请参阅man date),否则默认(请参阅代码)。

它使用了六月的最后一个星期六,而不是七月份的第一个星期六,因为我发现找到它更容易,它允许我只添加相关的周数和天数。

#!/bin/bash
date_format=${2:-%A %B %-d %Y}

code=$1
[[ ${#code} =~ ^[4-5]$ ]] || { echo "bad code"; exit 1; }

let year=1999+${code:0:2}
[[ ${#code} == 4 ]] && week=${code:2:1} || week=${code:2:2}
day=${code: -1}

june_last_saturday=$(cal 06 ${year} | awk '{ $6 && X=$6 } END { print X }')

date -d "${year}-06-${june_last_saturday} + ${week} weeks + $((${day}-1)) days" "+${date_format}"

示例:

$ seadate 06212
Sunday November 20 2005
$ seadate 0051
Saturday July 31 1999

答案 2 :(得分:-1)

我创建了一个希捷日期代码计算器,它实际上具有非常好的准确性。我在这个论坛上发布了它,供所有人使用:https://www.data-medics.com/forum/seagate-date-code-conversion-translation-tool-t1035.html#p3261

它比在线的其他人更准确,这通常指向完全错误的一年。我知道这不是一个bash脚本,但仍会为正在搜索如何执行此操作的其他人完成工作。

享受!