どうやらそれはを使ってもっと簡単にできるudevadm
と思います、そして私はちょうどその方法を見つけました。
あなたDEVNAME
から得るためにはudevadm
あなたはただ行う必要があります:
udevadm info -rq name $PATH
たとえば、/dev
名前を知りたい場合は、次のようにします/sys/dev/char/5:1
。
udevadm info -rq name /sys/dev/char/5:1
出力
/dev/console
-r
オプションを指定することで--root
、それなしで読み取り専用です上記の結果を-エド・パスをconsole
。-q
オプションは、データベースを指定--query
し、それがオペランドを取りname
、ここで-私たちはしたいのでDEVNAME
。
major:minor番号のみを指定してcharやブロックデバイスへのパスを見つける非常に簡単な方法は次のようになります。
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
だから実行中:
mmdev 8 0
プリント...
b:8:0:/dev/sda
これが最初に書いたものです。
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
これudevadm info --export-db
は、一致する数値の出力をスキャンするだけです。出力は次のようになります。
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
ワークフローは次のようなものです。
[^=]*DEVNAME=
各行の先頭から文字列を取り除こうとします
行に最初の文字がないか、最初の文字が古い/
行にその行をコピーするh
場合
行がパターンスペースにMAJOR=
追加N
入力行を追加する場合に一致します
パターンスペースに一致する2行がある場合は=$1\n.*=$2$
、h
古いスペースをパターンスペースにコピーして自動印刷します。そうでなければパターンスペースを削除
だから私がするなら:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
出力
/dev/vcsa5
/dev/sda
/dev/sda1
しかし、@ xaeが指摘するように、block / charタイプのデバイスはmaj:minの組み合わせを共有できるため、これにより、1回の呼び出しで複数のパスが出力される可能性があります。