对于半模糊的标题感到抱歉,我不确定如何说出来。我想要生成一个列表,不包括没有匹配的主要/次要编号的设备,然后运行
lkdev -l hdiskn -a -c DATAn
其中hdisk和DATA设备具有相应的主要/次要编号。
在/ dev中,我有 -
root@ testbox /dev
#ls -l | grep -E "DATA|hdisk" | grep -v rhd
crw-r--r-- 1 root system 18, 3 Oct 03 10:50 DATA01
crw-r--r-- 1 root system 18, 2 Oct 03 10:50 DATA02
brw------- 1 root system 18, 1 Apr 12 2013 hdisk0
brw------- 1 root system 18, 0 Apr 12 2013 hdisk1
brw------- 1 root system 18, 3 Jan 14 2014 hdisk2
brw------- 1 root system 18, 2 Jan 14 2014 hdisk3
brw------- 1 root system 18, 4 Jan 14 2014 hdisk4
基本上,我正在尝试创建hdisk0,1,4全部被排除的东西,而hdisk2-3分别用DATA01和DATA02锁定。
我最初尝试使用sort和/或uniq来隔离/删除字段,但是甚至无法生成所需的列表,甚至开始查看每个字段上运行命令。
(作为一个说明,我有几台服务器上有数百台。如果只是这几个,我会找到一种“更简单”的方式。)
答案 0 :(得分:0)
(我现在无法测试,所以请纠正语法错误,如果有的话)
你可以在
之下玩sort en uniqls -l | grep -E "DATA|hdisk" | sed -e 's/.* \([0-9]*, *[0-9]*\).*/\1/' | sort |
uniq -c | grep -v " 1" | cut -c8- | while read majorminor; do
ls -l | grep " ${majorminor}" | sed 's/.* //'
done
但是,您应该首先选择正确的行而不计算:
for data in $(find /dev -type c -name "DATA*" | cut -d/ -f3); do
majorminor="$(ls -l $data | sed -e 's/.* \([0-9]*, *[0-9]*\).*/\1/')"
echo "$data <==> $(ls -l hdisk* | grep " ${majorminor}" | sed 's/.* //')"
done