Well, last year I wrote a script which translates that ataX.YY
stuff to a device name, found here:
Linux ATA errors: Translating to a device name?
However, my personal version of this script has gotten major enhancements since then (will now even show the controller which the HDD is connected to, for instance), so it was just a one-minute job for me to cut it down to your special purposes:
#!/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)."
NOTE: The float_eval() auxiliary function, albeit not absolutely necessary, can avoid erroneous calculations in billions or trillions of bytes (GB resp. TB, not to be confused with GiB/TiB). Especially in TB range, such calculations may deviate more and more from their accurate values when calculated from block size in (long) integer.
The main reason (or cause) is that we have never used a decimal point with HDD capacities before hitting the 1 TB mark in HDD capacities some years ago, so integer calculations may no longer be appropriate in all cases.
Besides, I would be interested in someone improving this script so that it shows serial numbers when there are two drives with identical manufacturer ID. Unfortunately, I haven't been successful in finding this information in /sys/block/*
so far.