Preciso obter os nomes dos dispositivos de todos os discos USB conectados (ou seja, sdd
).
Tenho 3 discos USB conectados e 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
Quero ignorar os discos SATA, mas preciso listar todos os discos USB.
No terminal, eu posso nós ls
e isso 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
Mas preciso usar isso em um script. Preciso iterar todos os discos USB e não sei o caminho exato com antecedência, então preciso usar curingas ( *
ou ?
):
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
o procedimento acima só funciona se um disco USB estiver conectado. Se dois ou mais discos estiverem conectados, obtenho sdd
o /sys
caminho que não quero, ou seja:
/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
como posso iterar apenas sdd
sde
sdc
?
Estou procurando uma solução que não utilize udev
infraestrutura, ou seja/dev/disk/by-path/
Responder1
Você pode fazer isso com lsblk
comando.
lsblk -l -o name,tran
dá
NAME TRAN
sda sata
sda1
sdb usb
sdc usb
sr0 sata
-l
significa formato de "lista", por isso é mais fácil de analisar. Caso contrário, você obteria um formato de árvore como este:
NAME TRAN
sda sata
└─sda1
sdb usb
sr0 sata
Especificar outras flags lhe dará mais informações como FSTYPE, LABEL, UUID, MOUNTPOINT e muitas outras, basta executar lsblk --help
para ver todas as opções.
Você pode usar --paths --noheadings --scsi
sinalizadores para imprimir a saída assim:
sata /dev/sda
usb /dev/sdb
usb /dev/sdc
sata /dev/sr0
e depois grep
na entrada para filtrar essas linhas com usb no início da linha.
Responder2
Do lsusb
, fornece o nome dos dispositivos conectados através do barramento USB.
Como em:
$ 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
Veja tambémhomem lsusb
Descrição
lsusb é um utilitário para exibir informações sobre os barramentos USB no sistema e os dispositivos conectados a eles.