Necesito obtener los nombres de los dispositivos de todos los discos USB conectados (es decir sdd
).
Tengo 3 discos USB conectados y 2 discos 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
Quiero ignorar los discos SATA, pero necesito enumerar todos los discos USB.
En la terminal, puedo nosotros ls
y me dará 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
Pero necesito usar esto en un script. Necesito iterar sobre todos los discos USB y no sé la ruta exacta de antemano, así que tengo que usar comodines ( *
o ?
):
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
lo anterior solo funciona si hay un disco USB conectado. Si hay dos o más discos conectados, obtengo sdd
también la /sys
ruta, que no quiero, es decir:
/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
¿Cómo puedo iterar solo sobre sdd
sde
sdc
?
Estoy buscando una solución que no utilice udev
infraestructura, es decir/dev/disk/by-path/
Respuesta1
Puedes hacerlo con lsblk
comando.
lsblk -l -o name,tran
da
NAME TRAN
sda sata
sda1
sdb usb
sdc usb
sr0 sata
-l
significa formato de "lista", por lo que es más fácil de analizar. De lo contrario, obtendrías un formato de árbol como este:
NAME TRAN
sda sata
└─sda1
sdb usb
sr0 sata
Especificar otras banderas le brindará más información como FSTYPE, LABEL, UUID, MOUNTPOINT y muchas otras, simplemente ejecute lsblk --help
para ver todas las opciones.
Es posible que desee utilizar --paths --noheadings --scsi
banderas para imprimir la salida de esta manera:
sata /dev/sda
usb /dev/sdb
usb /dev/sdc
sata /dev/sr0
y luego grep
sobre la entrada para filtrar esas líneas con usb al principio de la línea.
Respuesta2
Do lsusb
, da el nombre de los dispositivos conectados a través del bus USB.
Como en:
$ lsusb
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0421:0802 Nokia Mobile Phones CA-42 Phone Parent
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Ver tambiénhombre lsusb
Descripción
lsusb es una utilidad para mostrar información sobre los buses USB del sistema y los dispositivos conectados a ellos.