2014-09-23 2 views
1

Seagate жесткие диски отображают код вместо даты изготовления. Код описан here, и онлайн-декодер доступен here.Как декодировать код даты жесткого диска Seagate в сценарии Bash

Короче говоря, это 4 или 5 цифр в виде YYWWD или YYWD, где:

  • YY является год, 00 год 1999
  • W или WW это номер недели, начиная с 1
  • D это день недели начала 1
  • Неделя 1 начинается в первую субботу июля в указанном году

Примеры

  • 06212 означает воскресенье 20 ноября 2005
  • 0051 означает субботу 31 июля 1999

Как это может быть расшифрованы в bash сценария?

ответ

2

Это то, что я сделал, это должно работать:

#!/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.

+0

Мне нравится, как вы получили начальную дату, используя '% u'; он чище, чем я пытался. – starfry

+0

Да, я тоже разбирался в выходе 'cal' ... Это действительно неустойчиво! – thriqon

+0

Я не имел ввиду EDIT оригинальное сообщение, только чтобы предложить исправить. – broomdodger

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 
-1

Я создал Дата кода калькулятор Seagate, который на самом деле работает с очень хорошей точностью. Я разместил его здесь на этом форуме для тех, кто может использовать: https://www.data-medics.com/forum/seagate-date-code-conversion-translation-tool-t1035.html#p3261

Это гораздо более точный, чем другие, которые часто указывают на совершенно неправильный год. Я знаю, что это не сценарий bash, но все равно будет выполняться для всех, кто ищет, как это сделать.

Наслаждайтесь!

Смежные вопросы