I have a question regarding the ports in Linux. If I connect my device via USB and want to check its port I can't do it using the command lsusb, which only specifies bus number and device number on this bus:

[ziga@Ziga-PC ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Is there a command that tells me the port the device is connected to directly? Only way to do this until now was to disconect and reconnect and using the command:

[ziga@Ziga-PC ~]$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.929510] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.378109] systemd[1]: Starting system-getty.slice.
[    4.378543] systemd[1]: Created slice system-getty.slice.
[    8.786474] usb 3-4.4: FTDI USB Serial Device converter now attached to ttyUSB0

In the last line it can be seen that my device is connected to /dev/ttyUSB0.

  • What are you trying to accomplish? Do you want to associate a device in /dev with an entry in lsusb? Or do you want to list all devices in /dev that are derived from a physical USB device? Or are you just wanting ls /dev/ttyUSB*? – phemmer Jul 11 '14 at 17:00
  • I just need a command which will give me port of a device and will not push me to disconnect and reconnect my devices. ls /dev/ttyUSB* will only list maybee 10 ports but from this list I cannot tell which one is for my device. – 71GA Jul 15 '14 at 16:41
  • 1
    I found this to be helpful. lsusb -v – tjaart55 Mar 27 '19 at 7:56

I'm not quite certain what you're asking. You mention 'port' several times, but then in your example, you say the answer is /dev/ttyUSB0, which is a device dev path, not a port. So this answer is about finding the dev path for each device.

Below is a quick and dirty script which walks through devices in /sys looking for USB devices with a ID_SERIAL attribute. Typically only real USB devices will have this attribute, and so we can filter with it. If we don't, you'll see a lot of things in the list that aren't physical devices.


for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && exit
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && exit
        echo "/dev/$devname - $ID_SERIAL"

On my system, this results in the following:

/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


find /sys/bus/usb/devices/usb*/ -name dev

Devices which show up in /dev have a dev file in their /sys directory. So we search for directories matching this criteria.


We want the directory path, so we strip off /dev.

devname="$(udevadm info -q name -p $syspath)"

This gives us the path in /dev that corresponds to this /sys device.

[[ "$devname" == "bus/"* ]] && exit

This filters out things which aren't actual devices. Otherwise you'll get things like USB controllers & hubs. The exit exits the subshell, which flows to the next iteration of the loop.

eval "$(udevadm info -q property --export -p $syspath)"

The udevadm info -q property --export command lists all the device properties in a format that can be parsed by the shell into variables. So we simply call eval on this. This is also the reason why we wrap the code in the parenthesis, so that we use a subshell, and the variables get wiped on each loop.

[[ -z "$ID_SERIAL" ]] && exit

More filtering of things that aren't actual devices.

echo "/dev/$devname - $ID_SERIAL"

I hope you know what this line does :-)

  • 2
    Thank you. I will learn a lot from your anwser and now I see that terms werent completely clear to me. Is there any shorter way? Maybee a command already integrated in the Linux itself? – 71GA Jul 17 '14 at 8:43
  • 1
    Suggest to change /bin/bash to /bin/sh and remove the ( ) for max compatibility – albfan Feb 5 '19 at 14:46
  • 1
    Doesn't work on Ubuntu 19.10 without removing the () – Tobias Gierke Mar 16 '20 at 19:13
  • 1
    @Walf Yes, that is the purpose. The eval creates unknown variables that differ per device. Without (), when it checks $ID_SERIAL, it could be from a previous device. – phemmer May 18 '20 at 4:43
  • 1
    @xinthose Thanks. I updated it for the newer bash. Should still work on old versions though. – phemmer May 26 '20 at 23:31

You can use this command to explore your device if connected to usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
  • 1
    The top answer didn't work on my machine, but this worked great. Thanks! – John M Jun 19 '17 at 14:45

Assuming that you know what the device you plugged in is, in 14.04 Ubuntu, at least, there is the command usb-devices that you can look through and find the information:

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 3
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev=04.04
S:  Manufacturer=Linux 4.4.0-131-generic ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=0000:00:1a.0
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

And the first line lists bus and port, as well as the device number that lsusb gives.

  • This is the correct answer, not sure why it doesn't have more votes. The rest are messes of awk etc. – Eric Drechsel Aug 14 '19 at 6:06
  • 5
    this does not show the /dev/* path – xinthose Oct 3 '19 at 18:11
  • To be fair, as the top answer notes, the question isn't clear on whether it's asking for "how do I derive the port" vs "how do I get the exact path?". – Gertlex Dec 4 '19 at 16:21
  • Is there a way to derive the /dev/... name from this information? – WoJ Dec 17 '19 at 15:36

You could try something like this below.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev
  • ow my eyes! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (The equivalent but clean...but still strange code; why not just ttyUSB together? and what was 2x rev for?) – Peter Nov 13 '17 at 11:40
  • 1
    The rev is used so the last field is accessed, this can be replaced by $NF: giving dmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}' – Léo Germond Apr 19 '19 at 13:47

Perhaps you would like to know just the path to USB-serial adapter that connected last?

dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1

Not the answer you're looking for? Browse other questions tagged or ask your own question.