Zdarzyło się raz… że potrzebna była lista ścieżek dostępnych dysków USB, dla skryptu BASH po OS Ubuntu. Dało to pole do małych eksperymentów, oto one.
- rozpocząłem od listy. lsbk wypisuje listę wszystkich urządzeń blokowych, prócz RAM-dysków:
wiks@dellwiks:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 97,9M 1 loop /snap/core/10577
loop1 7:1 0 140K 1 loop /snap/gtk2-common-themes/13
loop2 7:2 0 97,9M 1 loop /snap/core/10583
loop3 7:3 0 31,1M 1 loop /snap/snapd/10492
loop4 7:4 0 31,1M 1 loop /snap/snapd/10707
loop5 7:5 0 290,4M 1 loop /snap/vlc/1700
loop6 7:6 0 64,8M 1 loop /snap/gtk-common-themes/1514
loop7 7:7 0 55,4M 1 loop /snap/core18/1944
loop8 7:8 0 42,7M 1 loop /snap/leafpad/79
sda 8:0 0 477G 0 disk
├─sda1 8:1 0 277G 0 part /
├─sda2 8:2 0 100G 0 part
└─sda3 8:3 0 100G 0 part
sdb 8:16 0 149G 0 disk
└─sdb1 8:17 0 149G 0 part
sdc 8:32 0 931,5G 0 disk
├─sdc1 8:33 0 500,5G 0 part
└─sdc3 8:35 0 431G 0 part
sdd 8:48 1 57,9G 0 disk
└─sdd1 8:49 1 57,9G 0 part /media/wiks/64C5-C9D5
sde 8:16 1 14,5G 0 disk /media/wiks/USB_PLASNIE1
sdf 8:32 1 14,9G 0 disk
└─sdf1 8:33 1 14,9G 0 part /media/wiks/DISK_IMG1
sr0 11:0 1 1024M 0 rom
2.ograniczając to do dysków, przegrepuję po 'sd’: lsblk|grep sd :
wiks@dellwiks:~$ lsblk|grep sd
sda 8:0 0 477G 0 disk
├─sda1 8:1 0 277G 0 part /
├─sda2 8:2 0 100G 0 part
└─sda3 8:3 0 100G 0 part
sdb 8:16 0 149G 0 disk
└─sdb1 8:17 0 149G 0 part
sdc 8:32 0 931,5G 0 disk
├─sdc1 8:33 0 500,5G 0 part
└─sdc3 8:35 0 431G 0 part
sdd 8:48 1 57,9G 0 disk
└─sdd1 8:49 1 57,9G 0 part /media/wiks/64C5-C9D5
sde 8:16 1 14,5G 0 disk /media/wiks/USB_PLASNIE1
sdf 8:32 1 14,9G 0 disk
└─sdf1 8:33 1 14,9G 0 part /media/wiks/DISK_IMG1
3.a ponieważ interesuje mnie jedynie kolumna ze ścieżką (czyli 7-ma) ale tylko wtedy, gdy ścieżka zawiera 'media’ czyli zamontowane to coś jako dysk USB:
wiks@dellwiks:~$ lsblk|grep sd|awk '{print $7}'|grep media
/media/wiks/64C5-C9D5
/media/wiks/USB_PLASNIE1
/media/wiks/DISK_IMG1
4.tak. Wygląda ładnie, jednak aby korzystać z tego jako listy ścieżek reprezentujących dołączone dyski USB, trzeba to (teraz traktowane jako jeden string) podzielić w miejscach znaków nowej linii. Czyli to co uzyskamy w BASH:
#!/bin/bash
USBPATHS_STR=`lsblk|grep sd|awk '{print $7}'|grep media`
USBPATHS_LIST=(${USBPATHS_STR//$'\n'/ })
if [ ${#USBPATHS_LIST[@]} -eq 0 ]; then
echo 'none of USBstick found...'
else
for i in ${!USBPATHS_LIST[@]};
do
echo 'and one more local USB: '${USBPATHS_LIST[$i]}
done
fi
5. dzielę przez znak końca linii, a następnie, jeśli jakieś elementy listy występują, iteruje po nich, wypisując ścieżki do dysków.