Aparentemente se puede hacer de manera más simple udevadm
, y acabo de descubrir cómo.
Para obtener el DEVNAME
de udevadm
Solo hay que hacer:
udevadm info -rq name $PATH
Por ejemplo, si quisieras saber el /dev
nombre /sys/dev/char/5:1
que harías:
udevadm info -rq name /sys/dev/char/5:1
SALIDA
/dev/console
La -r
opción es especificar una --root
ruta ed; sin ella, el resultado anterior sería de solo lectura console
. La -q
opción especifica una base de datos --query
y toma el operando name
aquí, porque queremos el DEVNAME
.
Una forma muy simple de encontrar la ruta a un dispositivo de bloqueo y / o carácter dado solo el mayor: los números menores podrían verse así:
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
Entonces corriendo:
mmdev 8 0
huellas dactilares...
b:8:0:/dev/sda
Aquí está el primero que escribí.
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
Esto solo escanea la udevadm info --export-db
salida para los números coincidentes. El resultado se ve así:
P: /devices/virtual/vc/vcsa4
N: vcsa4
E: DEVNAME=/dev/vcsa4
E: DEVPATH=/devices/virtual/vc/vcsa4
E: MAJOR=7
E: MINOR=132
E: SUBSYSTEM=vc
P: /devices/virtual/vc/vcsa5
N: vcsa5
E: DEVNAME=/dev/vcsa5
E: DEVPATH=/devices/virtual/vc/vcsa5
E: MAJOR=7
E: MINOR=133
E: SUBSYSTEM=vc
#...and so on
El flujo de trabajo es como:
intente quitar la [^=]*DEVNAME=
cuerda del encabezado de cada línea
si una línea no tiene un primer carácter o su primer carácter es /
copiar esa línea sobre el h
espacio antiguo
Si una línea coincide, MAJOR=
anexe N
la línea de entrada ext al espacio del patrón
si hay 2 líneas en el espacio del patrón que coinciden =$1\n.*=$2$
, copie el h
espacio anterior sobre el espacio del patrón y autoimprima; de lo contrario, elimine el espacio del patrón
Entonces si lo hago:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
SALIDA
/dev/vcsa5
/dev/sda
/dev/sda1
Pero, como señala @xae, los dispositivos de tipo block / char pueden compartir combinaciones maj: min, por lo que esto podría imprimir más de una ruta por llamada.