Peter me inspirou a escrever um script avançado (let), que pode até detectar pendrives (em vez de gerar coisas bobas como "ata0.00"). Ao contrário do roteiro de Pedro, você também obterá o subnúmero (como em 4.01) se tiver mais de um dispositivo no mesmo controlador resp. canal. A saída será exatamente como você obtém em syslog
.
Testado. Funcionando muito bem na minha caixa Debian, embora sempre haja muitas melhorias (por exemplo, regexps muito desajeitados). Mas mantenha isso! O número aparentemente alto de caracteres de escape que você pode encontrar nos meus regexps é apenas por razões de compatibilidade! Você não pode assumir o GNU sed
com todos, e é por isso que fiz sem regexps estendidos de propósito.
ATUALIZAÇÕES
(1) não irá mais analisar ls
output. (oops!) Já que todos vocês sabem: Não analisam ls.
(2) Agora também funciona em ambientes somente leitura.
(3) Inspirado por uma sugestão desse bate-papo aqui eu consegui novamente fazer com que as instruções sed sejam menos complicadas.
#!/bin/bash
# note: inspired by Peter
#
# *UPDATE 1* now we're no longer parsing ls output
# *UPDATE 2* now we're using an array instead of the <<< operator, which on its
# part insists on a writable /tmp directory:
# restricted environments with read-only access often won't allow you that
# save original IFS
OLDIFS="$IFS"
for i in /sys/block/sd*; do
readlink $i |
sed 's^\.\./devices^/sys/devices^ ;
s^/host[0-9]\{1,2\}/target^ ^ ;
s^/[0-9]\{1,2\}\(:[0-9]\)\{3\}/block/^ ^' \
\
|
while IFS=' ' read Path HostFull ID
do
# OLD line: left in for reasons of readability
# IFS=: read HostMain HostMid HostSub <<< "$HostFull"
# NEW lines: will now also work without a hitch on r/o environments
IFS=: h=($HostFull)
HostMain=${h[0]}; HostMid=${h[1]}; HostSub=${h[2]}
if echo $Path | grep -q '/usb[0-9]*/'; then
echo "(Device $ID is not an ATA device, but a USB device [e. g. a pen drive])"
else
echo $ID: ata$(< "$Path/host$HostMain/scsi_host/host$HostMain/unique_id").$HostMid$HostSub
fi
done
done
# restore original IFS
IFS="$OLDIFS"