No estoy muy seguro de lo que estás preguntando. Menciona 'puerto' varias veces, pero luego, en su ejemplo, dice que la respuesta es /dev/ttyUSB0, que es una ruta de desarrollo del dispositivo, no un puerto. Entonces, esta respuesta se trata de encontrar la ruta de desarrollo para cada dispositivo.
A continuación se muestra un script rápido y sucio que recorre los dispositivos en /sysbusca de dispositivos USB con un ID_SERIALatributo. Por lo general, solo los dispositivos USB reales tendrán este atributo, por lo que podemos filtrar con él. Si no lo hacemos, verá muchas cosas en la lista que no son dispositivos físicos.
#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath="${sysdevpath%/dev}"
devname="$(udevadm info -q name -p $syspath)"
[[ "$devname" == "bus/"* ]] && continue
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && continue
echo "/dev/$devname - $ID_SERIAL"
)
done
En mi sistema, esto da como resultado lo siguiente:
/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard
Explicación:
find /sys/bus/usb/devices/usb*/ -name dev
Los dispositivos que aparecen /devtienen un devarchivo en su /sysdirectorio. Entonces buscamos directorios que coincidan con este criterio.
syspath="${sysdevpath%/dev}"
Queremos la ruta del directorio, así que nos despojamos /dev.
devname="$(udevadm info -q name -p $syspath)"
Esto nos da la ruta /devque corresponde a este /sysdispositivo.
[[ "$devname" == "bus/"* ]] && continue
Esto filtra cosas que no son dispositivos reales. De lo contrario, obtendrá cosas como controladores USB y concentradores.
eval "$(udevadm info -q property --export -p $syspath)"
El udevadm info -q property --exportcomando enumera todas las propiedades del dispositivo en un formato que el shell puede analizar en variables. Entonces simplemente llamamos evala esto. Esta es también la razón por la que envolvemos el código entre paréntesis, de modo que usamos un subshell y las variables se borran en cada bucle.
[[ -z "$ID_SERIAL" ]] && continue
Más filtrado de cosas que no son dispositivos reales.
echo "/dev/$devname - $ID_SERIAL"
Espero que sepas lo que hace esta línea :-)
/devcon una entradalsusb? ¿O desea enumerar todos los dispositivos/devderivados de un dispositivo USB físico? ¿O solo quieresls /dev/ttyUSB*?