You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判定USB设备类别并存储设备编号?多U盘适配脚本开发问询

嘿,你的思路完全没问题!咱们可以把这个方案落地,还能轻松支持多个U盘的场景,我给你一步步拆解清楚:

核心思路

lsusb -t的输出里,USB大容量存储设备的行会明确包含Class=Mass Storage(或者简化的Class=Mass),而且每行自带Dev x标识。我们要做的就是:筛选出这些行 → 提取出Dev后面的数字 → 把这些数字存起来方便后续处理。

具体实现脚本

先给你一个直接能用的bash脚本,我会逐行解释:

#!/bin/bash

# 1. 提取所有USB大容量存储设备的Dev编号,存到数组里
# 这里用grep筛选目标行,sed正则提取数字
mass_devs=($(lsusb -t | grep "Class=Mass" | sed -E 's/.*Dev ([0-9]+).*/\1/'))

# 2. 检查是否找到设备
if [ ${#mass_devs[@]} -eq 0 ]; then
    echo "⚠️  没有检测到USB大容量存储设备"
    exit 1
fi

# 3. 输出并处理找到的设备
echo "✅  找到以下USB大容量存储设备的Dev编号:"
for dev_num in "${mass_devs[@]}"; do
    echo "- Dev $dev_num"
    # 如果你需要查看该设备的详细信息,可以加这行
    # lsusb | grep "Dev $dev_num"
done

关键命令拆解

怕你对正则和bash数组不熟,我把核心命令拆开讲:

  • lsusb -t | grep "Class=Mass":过滤出所有大容量存储设备的行
  • sed -E 's/.*Dev ([0-9]+).*/\1/':用正则提取Dev后面的数字
    • -E:启用扩展正则,让语法更直观
    • .*Dev ([0-9]+).*:匹配任意字符+Dev +一串数字+任意字符,括号里的[0-9]+就是我们要抓的数字
    • \1:把整行替换成刚才括号里捕获的数字

备选方案:用awk更灵活

如果你觉得sed的正则有点绕,也可以用awk来实现,逻辑更清晰:

mass_devs=($(lsusb -t | awk '/Class=Mass/ {
    for(i=1; i<=NF; i++) {
        if ($i ~ /Dev/) {
            sub(/,/, "", $i)  # 去掉数字后面的逗号
            print substr($i, 4)  # 从第4个字符开始取,就是Dev后面的数字
        }
    }
}'))

注意事项

  1. 不同系统的lsusb -t输出可能略有差异,如果你的系统里Class名称是Mass Storage,grep "Class=Mass"依然能匹配到,不用改
  2. 普通用户就能执行lsusb,不需要sudo权限
  3. 如果要进一步操作这些设备(比如挂载),可能需要用到/dev/sd*这类设备文件,这时候可以结合lsblk或者udevadm来关联Dev编号和实际设备路径,有需要的话可以再深挖~

内容的提问来源于stack exchange,提问作者Coffeeman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:07:12