Как получить имя файла устройства из вывода lsusb или по пути устройства

Связанный вопрос: уведомление о подключении / отключении USB

Когда устройство подключено / отключено, я получаю мгновенное уведомление, это здорово. Но чтобы сделать это (почти) идеальным, я также хочу получить имя файла устройства, например /dev/ttyUSB0 , и, еще лучше, все символические ссылки на него.

Но я не могу найти, как получить эту информацию от udev , или от lsusb , или как-то еще. Единственный идентификатор устройства, который у меня есть, – это путь к устройству, например /devices/pci0000:00/0000:00:1d.0/usb5/5-1 . Как получить имя файла устройства?

  • Клавиатура с анти-ореолом (NKRO over USB)
  • live USB linux на macbook pro в середине 2012 года
  • USB-CAN-адаптер работает вручную, но не через udev
  • Команда dd выходит из строя с ошибкой «Вход / выход» при записи USB-накопителя
  • Как подключить USB-устройство к Beagleboneblack?
  • Снимок диска
  • Включить numlock только для внешней клавиатуры
  • Не удалось загрузить Chromium OS с USB-накопителя
  • 2 Solutions collect form web for “Как получить имя файла устройства из вывода lsusb или по пути устройства”

    Предположим, что я пытаюсь найти устройство для своей UVC-камеры, lsusb дает мне:

     Bus 001 Device 004: ID 1e4e:0102 Cubeternet GL-UPC822 UVC WebCam 

    Имя файла устройства – это /dev/bus/usb/001/004 (первым компонентом является идентификатор шины, далее – идентификатор устройства).

    Я только что построил для этого скрипт, это не очень, но работает для меня.

    Я протестировал этот скрипт на 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 которое сильно отличается от вашего, я надеюсь, что это сработает и для вас.

    Также обратите внимание, что этот скрипт зависит от пакета usbutils для программы usb-devices , я полагаю, что он установлен по умолчанию во всех Linux, но я могу ошибаться.

    Script 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, eg: "sdx" BASENAME=`file /dev/disk/by-id/* | grep -v 'part' | grep -Po "$USB_Serial.*/\K[^/]+$"` # Build the full address, eg: "/dev/sdx" NAME="/dev/$BASENAME" # Output the address: echo $NAME 

    Применение:

     $ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')" /dev/sdb 

    Я надеюсь, что это помогает.

    Linux и Unix - лучшая ОС в мире.