6

I would like to list only the USB storage devices connected to my computer. Since these are SCSI disks, I used the command lsscsi, which lists the USB drives as well as my computer's hard drive and CD drive. Is there a way to ignore the memory storage that's not a USB? I have also tried lsusb, but this includes my keyboard, mouse, and other non-storage devices.

5
  • So "I would like to list only the USB devices connected to my computer." is not what you want? Do you want to list only the USB storage devices on your computer?
    – 111---
    Jul 8, 2015 at 20:04
  • Yes, I want just the storage devices. I have edited my question. Thanks!
    – Kalmar
    Jul 8, 2015 at 20:06
  • 1
  • @don_crissti well that's a little gem hidden away in the comments. Any reason why you didn't provide it as an answer? I don't understand StackExchance that well so there could be a good reason.
    – whossname
    Sep 24, 2021 at 3:09
  • 1
    @whossname - well, my comment is actually a link... ;) Sep 25, 2021 at 11:12

4 Answers 4

8

This answer checks the list of all attached block devices and iterates over them with udevadmin to check their respective ID_BUS.

You can see all attached block devices in /sys/block. Here is the bash script from the linked answer that should let you know if it is a USB storage device:

for device in /sys/block/*
do
    if udevadm info --query=property --path=$device | grep -q ^ID_BUS=usb
    then
        echo $device
    fi
done
2
  • props for the ^ID_BUS=usb I was thinking how to achieve this.
    – vfbsilva
    Jul 8, 2015 at 20:21
  • That part came from the linked answer :) But yeah it is pretty smooth.
    – 111---
    Jul 8, 2015 at 20:27
1

I just wrote a function:

dmu() {
  # Criação       : 2019-07-24 RBR.
  local disks=`lsblk -o name,tran | awk '$2=="usb"{print $1}' | tr "\n" " " | sed -E "s/^ +//g;s/ +$//g"`
  local mask=`sed -E "s/ /\([\\\\t ]|[0-9]\)+|/g;s/$/\([\\\\t ]|[0-9]\)+/g" <<< ${disks}`
  lsblk -f | sed -n "1p" 
  lsblk -f | grep -E "$mask"
}
0
lsblk --noheadings --nodeps --paths --raw --output NAME,RM,TRAN,TYPE | grep " 1 usb disk$" | cut --delimiter " " --fields 1

Example output:

/dev/sdd
/dev/sde
/dev/sdf

Basically, with grep you filter removable USB disks. Some examples of unfiltered lsblk output for various devices:

  • /dev/loop0 0 loop
  • /dev/sda 0 sata disk SATA SSD
  • /dev/sdb 0 sata disk SATA HDD
  • /dev/sdd 1 usb disk USB flash drive
  • /dev/sr0 1 sata rom SATA DVD-RW
-1

You can use lsblk.

lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465,8G  0 disk 
├─sda1   8:1    0   285M  0 part /boot
├─sda2   8:2    0   1,9G  0 part [SWAP]
├─sda3   8:3    0  74,5G  0 part /
└─sda4   8:4    0 389,1G  0 part /home
sr0     11:0    1  1024M  0 rom  

Usualy usb devices are on sdb so lsblk sdb should give all usb devices.

1
  • I think this might work. The only thing is that SCSI disks are added in the order that they're mounted and so I'd just have to assume that my hard drive and DVD drive were only sda.
    – Kalmar
    Jul 8, 2015 at 21:02

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .