เห็นได้ชัดว่าสามารถทำได้ง่ายขึ้นด้วย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
เพราะเราต้องการ
วิธีที่ง่ายมากในการค้นหาเส้นทางไปยังอุปกรณ์ char และ / หรือ block ที่กำหนดเฉพาะหลัก: ตัวเลขเล็กน้อยอาจมีลักษณะดังนี้:
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 ชุดค่าผสมและดังนั้นสิ่งนี้อาจพิมพ์มากกว่าหนึ่งเส้นทางต่อการโทร