関連質問: SB接続/切断通知
デバイスのプラグを抜いたり抜いたりすると、すぐに通知されます。しかし、それを(ほぼ)完璧にするために、/dev/ttyUSB0
のようなデバイスファイル名と、さらに良いことに、そのファイルへのすべてのシンボリックリンクも取得したいと考えています。
しかし、udev
から、またはlsusb
から、または他の方法でこの情報を取得する方法を見つけることができません。私が持っているデバイスの唯一のIDは、/devices/pci0000:00/0000:00:1d.0/usb5/5-1
のようなデバイスパスです。それからデバイスのファイル名を取得する方法は?
UVCカメラ用のデバイスを見つけようとしているとすると、lsusbは次のように表示します。
Bus 001 Device 004: ID 1e4e:0102 Cubeternet GL-UPC822 UVC WebCam
デバイスのファイル名は/dev/bus/usb/001/004
(最初のコンポーネントはバスID、次はデバイスID)。
私はそのためのスクリプトを作成しただけです。それはきれいではありませんが、私にとってはうまくいきます。
このスクリプトをArch Linuxで次の構成でテストしました。
$ uname -a
Linux 4.4.13-1-lts #1 SMP Wed Jun 8 16:44:31 CEST 2016 x86_64 GNU/Linux
そして、私のデバイス名は/dev/sdb
であり、これはあなたのデバイス名とはかなり異なります。
このスクリプトはusb-devices
プログラムのusbutils
パッケージに依存していることにも注意してください。すべてのLinuxにデフォルトでインストールされていると思いますが、間違っている可能性があります。
スクリプトusbname
:
#!/usr/bin/bash
# Input should be a single line from lsusb output:
DATA=$1
# Read the bus number:
BUS=`echo $DATA | grep -Po 'Bus 0*\K[1-9]+'`
# Read the device number:
DEV=`echo $DATA | grep -Po 'Device 0*\K[1-9]+'`
FOUND=false
USB_Serial=""
# Search for the serial number of the PenDrive:
while read line
do
if [ $FOUND == true ]; then
USB_Serial=`echo "$line" | grep -Po 'SerialNumber=\K.*'`
if [ "$USB_Serial" != "" ]; then
break;
fi
fi
if [ "`echo "$line" | grep -e "Bus=0*$BUS.*Dev#= *$DEV"`" != "" ]; then
FOUND=true
fi
done <<< "$(usb-devices)"
# Get the base name of the block device, e.g.: "sdx"
BASENAME=`file /dev/disk/by-id/* | grep -v 'part' | grep -Po "$USB_Serial.*/\K[^/]+$"`
# Build the full address, e.g.: "/dev/sdx"
NAME="/dev/$BASENAME"
# Output the address:
echo $NAME
使用法:
$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb