J'ai besoin d'une liste de tous les noms de périphérique de disque (pas d'USB ou de CD-ROM) sous la forme suivante: DRIVES = 'sda sdb' pour pouvoir les parcourir en boucle dans un script bash.
La solution idéale n'aurait pas besoin d'installer un utilitaire spécial et utiliserait/sys |/proc |/dev à partir du système de fichiers.
Copiez le script python suivant dans un fichier nommé internal_block_device_resource
:
#!/usr/bin/env python3
import os
import re
from glob import glob
rootdir_pattern = re.compile('^.*?/devices')
internal_devices = []
def device_state(name):
"""
Follow pmount policy to determine whether a device is removable or internal.
"""
with open('/sys/block/%s/device/block/%s/removable' % (name, name)) as f:
if f.read(1) == '1':
return
path = rootdir_pattern.sub('', os.readlink('/sys/block/%s' % name))
hotplug_buses = ("usb", "ieee1394", "mmc", "pcmcia", "firewire")
for bus in hotplug_buses:
if os.path.exists('/sys/bus/%s' % bus):
for device_bus in os.listdir('/sys/bus/%s/devices' % bus):
device_link = rootdir_pattern.sub('', os.readlink(
'/sys/bus/%s/devices/%s' % (bus, device_bus)))
if re.search(device_link, path):
return
internal_devices.append(name)
for path in glob('/sys/block/*/device'):
name = re.sub('.*/(.*?)/device', '\g<1>', path)
device_state(name)
print(' '.join(internal_devices))
Assurez-vous que le script dispose d'une autorisation d'exécution:
chmod +x internal_block_device_resource
Définissez votre variable DRIVES
bash de la manière suivante:
DRIVES=$(./internal_block_device_resource)
$ echo $DRIVES
sda
Vous devez filtrer les périphériques amovibles pour pouvoir utiliser cette commande:
find /sys/block/*/device/block/*/removable -exec bash -c 'echo {} | Perl -ne "\$a=\$_;s/^\/sys\/block\/(.*?)\/.*/\$1/;print if (\`cat \$a\` == "0")"' \;
Avec une clé USB montée en tant que /dev/sdb
, la sortie est simplement sda
.
Cela fonctionne pour moi:
echo DRIVES=\'`cd /dev; ls sd?; cd`\'
Il va simplement dans le répertoire/dev et sort tout avec sd et un caractère supplémentaire. Après cela, il rentre à la maison.
Utilisez lsblk
:
$ lsblk -o NAME -nl
sda
sda1
sda2
sda4
sda5
sda6
sdb
sdb1
sdb2
sdb5
sdb6
sr0
Cela inclura tout ce qui vaut la peine d'être inclus. Vous pouvez utiliser l'option -I
avec le type type de périphérique pour effectuer le filtrage.