Вы можете легко сделать это в bash:
input='2.6.4.0-91'
input=${input%-*}
input=${input//./}
echo "$input"
2640
Ответ @mosvy не работает в системах Debian, поскольку /sys/bus/usb/devices содержит символические ссылки. Также не будет работать переход по символическим ссылкам с grep -R
, потому что эта файловая система содержит циклы символических ссылок.
Более простой способ получить то, что вам нужно, это:
lsusb | grep NameOfYourDevice | sed -nr 's|Bus (.*) Device ([^:]*):.*|/dev/bus/usb/\1/\2|p'
Он преобразует вывод lsusb (из пакета usbutils )в путь /dev/bus/usb/...
Если вам нужно блочное/символьное имя устройства, попробуйте что-то вроде этого:
device() {
v=${1%:*}; p=${1#*:}
for dir in `find /sys/ -name idVendor | rev | cut -d/ -f 2- | rev`; do
if grep -q $v $dir/idVendor; then
if grep -q $p $dir/idProduct; then
find $dir -name 'device' | rev | cut -d / -f 2 | rev
fi
fi
done
}