使用 idVendor/idProduct 查找 USB 设备的目录 /sys/bus/usb/devices/

使用 idVendor/idProduct 查找 USB 设备的目录 /sys/bus/usb/devices/

我正在尝试编写一个脚本,获取使用 打印的产品和供应商 ID lsusb,然后根据此 ID 查找 中的 USB 设备目录/sys/bus/usb/devices

我最初以为 lsusb 打印的总线和设备号会指向相应的文件夹。例如,如果Bus = 002Device = 002,则 USB 的目录将是/usb/devices/2-2。不幸的是,事实并非如此。

我可以使用在另一个线程中找到的命令手动找到相应的文件夹:

for X in /sys/bus/usb/devices/*; do 
    echo "$X"
    cat "$X/idVendor" 2>/dev/null 
    cat "$X/idProduct" 2>/dev/null
    echo
done

但是,我需要一个可以自动找到该文件夹​​的脚本。

答案1

如果我理解了你的问题,那么以下脚本应该可以完成这项工作:

#!/bin/bash

if [ $# -ne 2 ];then
  echo "Usage: `basename $0` idVendor idProduct"
  exit 1
fi


for X in /sys/bus/usb/devices/*; do 
    if [ "$1" == "$(cat "$X/idVendor" 2>/dev/null)" -a "$2" == "$(cat "$X/idProduct" 2>/dev/null)" ]
    then
        echo "$X"
    fi
done

答案2

实际上你可以做得更简单一些:

rgrep -l $1 /sys/bus/usb/devices/*/idVendor | sed 's/\(.*\)\/idVendor/\1/' | xargs -iXXX rgrep -l $2 XXX/idProduct | sed 's/\(.*\)\/idProduct/\1/'

但是,如果您想将其保存为脚本,则可能需要保留健全性检查:

#!/bin/bash

if [ $# -ne 2 ];then
  echo "Usage: `basename $0` idVendor idProduct"
  exit 1
fi

rgrep -l ^${1}$ /sys/bus/usb/devices/*/idVendor | sed 's/\(.*\)\/idVendor/\1/' | xargs -iXXX rgrep -l ^${2}$ XXX/idProduct | sed 's/\(.*\)\/idProduct/\1/'

相关内容