获取连接U盘的设备名称

Mar*_*ter 7 usb path shell-script

我需要获取所有连接的 USB 磁盘的设备名称(即sdd)。

我插入了 3 个 USB 磁盘和 2 个 SATA 磁盘:

$ find /sys/devices/ -name block        
/sys/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host5/target5:0:0/5:0:0:0/block
/sys/devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host6/target6:0:0/6:0:0:0/block
/sys/devices/pci0000:00/0000:00:14.0/usb4/4-5/4-5:1.0/host4/target4:0:0/4:0:0:0/block
/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block
/sys/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block
Run Code Online (Sandbox Code Playgroud)

我想忽略SATA磁盘,但我需要列出所有USB磁盘。

在终端,我可以我们ls,它会给我sdd

$ ls /sys/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host5/target5:0:0/5:0:0:0/block
sdd
Run Code Online (Sandbox Code Playgroud)

但我需要在脚本中使用它。我需要遍历所有的U盘,而且我事先不知道确切的路径,所以我必须使用通配符(*?):

for DISK in $(ls /sys/devices/pci0000:00/0000:00:14.0/usb?/*/*:1.0/host?/target?:0:0/?:0:0:0/block) ; do
echo /dev/$DISK
done
Run Code Online (Sandbox Code Playgroud)

以上仅在插入一个 USB 磁盘时才有效。如果插入两个或多个磁盘,我得到sdd/sys路径以及我不想要的路径,即:

/dev//sys/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/host5/target5:0:0/5:0:0:0/block:
/dev/sdd
/dev//sys/devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host6/target6:0:0/6:0:0:0/block:
/dev/sde
/dev//sys/devices/pci0000:00/0000:00:14.0/usb4/4-5/4-5:1.0/host4/target4:0:0/4:0:0:0/block:
/dev/sdc
Run Code Online (Sandbox Code Playgroud)

我怎么能只迭代sdd sde sdc

我正在寻找不使用udev基础设施的解决方案,即/dev/disk/by-path/

sty*_*fly 8

你可以用lsblk命令来做。

lsblk -l -o name,tran

NAME TRAN
sda  sata
sda1 
sdb  usb
sdc  usb
sr0  sata
Run Code Online (Sandbox Code Playgroud)

-l代表“列表”格式,因此更容易解析。否则,你会得到这样的树格式:

NAME   TRAN
sda    sata
??sda1
sdb    usb
sr0    sata
Run Code Online (Sandbox Code Playgroud)

指定其他标志将为您提供更多信息,如 FSTYPE、LABEL、UUID、MOUNTPOINT 和许多其他信息,只需运行lsblk --help即可查看所有选项。

您可能希望使用--paths --noheadings --scsi标志来像这样打印输出:

sata   /dev/sda
usb    /dev/sdb
usb    /dev/sdc
sata   /dev/sr0
Run Code Online (Sandbox Code Playgroud)

然后grep通过输入过滤掉那些行首带有 usb 的行。