Görünüşe göre daha basit bir şekilde yapılabilir udevadm
ve nasıl olduğunu öğrendim.
Almak için DEVNAME
gelen udevadm
sizin sadece yapmanız gereken:
udevadm info -rq name $PATH
Örneğin, /dev
adının /sys/dev/char/5:1
ne olacağını bilmek isterseniz:
udevadm info -rq name /sys/dev/char/5:1
ÇIKTI
/dev/console
-r
Seçenek belirtmektir --root
sadece okurdum yukarıda onsuz sonucu - ed yolunu console
. -q
Seçenek bir veritabanı belirtir --query
ve işlenen alır name
burada - biz istediğimiz için DEVNAME
.
Yalnızca büyük verilen bir karakter ve / veya blok cihazının yolunu bulmanın çok basit bir yolu: küçük sayılar şöyle görünebilir:
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
Yani koşuyor:
mmdev 8 0
baskılar ...
b:8:0:/dev/sda
İşte ilk yazdığım.
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
Bu sadece udevadm info --export-db
eşleşen numaraların çıktısını tarar . Çıktı şöyle görünür:
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
İş akışı şöyledir:
[^=]*DEVNAME=
dizeyi her satırın başından ayırmaya çalışın
bir satırın ilk karakteri yoksa veya ilk karakteri /
o satırı h
eski alana kopyalarsa
bir çizgi eşleşirse desen alanına MAJOR=
ek N
giriş satırı ekler
desen alanında eşleşen 2 satır varsa eski alanı desen alanı üzerine =$1\n.*=$2$
kopyalayın h
ve otomatik yazdırın; başka desen alanını sil
Yani ben yaparsam:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
ÇIKTI
/dev/vcsa5
/dev/sda
/dev/sda1
Ancak, @xae'nin işaret ettiği gibi, blok / karakter tipi cihazlar maj: min kombinasyonlarını paylaşabilir ve bu nedenle arama başına birden fazla yol yazdırılabilir.