Bem, no ano passado eu escrevi um script que traduz esse ataX.YY
stuff para um nome de dispositivo, encontrado aqui:
Erros do Linux ATA: Traduzindo para um nome de dispositivo?
No entanto, minha versão pessoal deste script recebeu melhorias importantes desde então (agora mostrará até mesmo o controlador ao qual o HDD está conectado, por exemplo), então foi apenas um minuto trabalho para mim para reduzi-lo para seus propósitos especiais:
#!/bin/bash
#
# LICENSE: GPL
function float_eval()
{
local st=0
local r=0.0
if [[ $# -gt 0 ]]; then
r=$(echo "scale=5; $*" | bc -q 2>/dev/null)
st=$?
if [[ $st -eq 0 && -z "$r" ]]; then st=1; fi
fi
echo $r
return $st
}
_heahdcnt=0
_badhdcnt=0
_usbcnt=0
echo -e "\nRetrieving assignments from /sys/block ..."
while read Path ID
do
sizeBlk=$(< /sys/block/$ID/size)
if grep -q '/usb[0-9]*/' <<< $Path; then
echo -ne "\n\n(Device /dev/$ID is not an ATA device, but a USB device [e. g. a pen drive])"
((_usbcnt++))
else
if [ ! -f /sys/block/$ID/device/model ]; then
echo -e "Error: Couldn't determine model of /dev/$ID\!\n"
else
echo -ne "\n\n/dev/$ID is a $(< /sys/block/$ID/device/model)"
# when we get a 0, something went wrong; so in this case, skip any calculations
if [ $sizeBlk -gt 0 ]; then
sizegib=$((sizeBlk >> 21))
# nb: since current bc cannot do bit shift operations without external modules
# loaded at runtime, we will resort to a temp variable which contains the
# shifted value
sizeBlkLsh9=$((sizeBlk << 9))
sizegb=$(float_eval "$sizeBlkLsh9 / 1000000000")
# use formatted output, don't mix literals and arithmetic in one string (as with echo)
LC_NUMERIC=C printf " (%4.0f GiB / %4.0f GB )" $sizegib $sizegb
((_heahdcnt++))
else
((_badhdcnt++))
fi
fi
[[ $sizeBlk -eq 0 ]] && echo "WARNING: There appears to be some trouble with device \
/dev/$ID. You should check this more thoroughly."
fi
# process substitution
done < <(ls -l /sys/block/sd* \
\
| sed -e 's^.*-> \.\.^/sys^' \
-e 's^/host[0-9]\{1,2\}/target\([0-9]\{1,2\}\(:[0-9]\)\{2,3\}/\)\{1,2\}block/^ ^')
echo -e "\n\nScanning of hardware completed.\n"
echo "You have $[$_heahdcnt + $_badhdcnt + $_usbcnt] devices connected:"
echo -n "$_heahdcnt healthy HDD(s), $_badhdcnt bad HDD(s)"
[[ $_usbcnt -gt 0 ]] && echo " and $_usbcnt USB device(s)."
NOTA: A função auxiliar float_eval (), embora não seja absolutamente necessária, pode evitar cálculos errôneos em bilhões ou trilhões de bytes (GB e TB, não confundir com GiB / TiB). Especialmente na faixa de TB, esses cálculos podem desviar-se cada vez mais de seus valores precisos quando calculados a partir do tamanho do bloco em inteiro (longo).
A principal razão (ou causa) é que nunca usamos um ponto decimal com as capacidades do HDD antes de atingir a marca de 1 TB nas capacidades do HDD há alguns anos, portanto os cálculos de números inteiros podem não ser mais apropriados em todos os casos .
Além disso, eu estaria interessado em alguém melhorar este script para que ele mostre números de série quando houver duas unidades com identificação de fabricante idêntica. Infelizmente, até agora não consegui encontrar essa informação em /sys/block/*
.