我需要以下形式的所有磁盘设备名称(不是 USB 或 CD ROM)的列表 DRIVES='sda sdb',以便我可以在 bash 脚本中循环遍历它们。
理想的解决方案是不必安装特殊的实用程序,而是使用文件系统中的 /sys|/proc|/dev。
答案1
建议的解决方案:
将以下 Python 脚本复制到名为的文件中
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))
确保脚本具有可执行权限:
chmod +x internal_block_device_resource
DRIVES
通过以下方式设置你的bash 变量:DRIVES=$(./internal_block_device_resource)
$ echo $DRIVES sda
初始版本:
您需要过滤可移动设备,以便可以使用此命令:
find /sys/block/*/device/block/*/removable -exec bash -c 'echo {} | perl -ne "\$a=\$_;s/^\/sys\/block\/(.*?)\/.*/\$1/;print if (\`cat \$a\` == "0")"' \;
使用 USB 棒安装后/dev/sdb
,输出仅为sda
。
答案2
这对我有用:
echo DRIVES=\'`cd /dev; ls sd?; cd`\'
它只是进入 /dev 目录并输出带有 sd 和另一个字符的所有内容。之后,它返回主目录。
答案3
答案4
您可以使用标准 Linux 实用程序执行此操作:
lsblk -n --scsi --output PATH,RM | \
grep 0 | \
awk -F ' ' '{print $1}'
lsblk --scsi --output PATH,RM
将列出所有 SCSI 设备及其路径以及它们是否可移动。在我的系统上,它看起来像这样:
/dev/sda 1
/dev/sdb 0
/dev/sdc 0
/dev/sdd 0
/dev/sde 0
可移动设备的第二列为 1,不可移动设备的第二列为 0。我们将列表过滤为仅包含那些不可移动设备,并输出第一个字段,即设备的路径。这将为您提供如下列表:
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde
将其保存在变量中将允许您循环遍历系统中每个不可移动驱动器的路径。
$ export DEVICES=$(lsblk -n --scsi --output PATH,RM | grep 0 | awk '{print $1}')
$ for DEVICE in $DEVICES; do echo $DEVICE; done
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde