我的目录中有此文件
ls -l /toto/
total 0
brw-rw---- 1 tata par 112, 24 Apr 16 13:08 file1
brw-rw---- 1 tata par 112, 23 Apr 16 13:08 file2
我的bash必须验证所有行的数字112是否存在
for f in $(ls -l /toto/);
do
fff=`grep "112" $f`
echo $fff
done
result:
grep: tata: No such file or directory
grep: 112: No such file or directory
grep: file1: No such file or directory
为什么?怎么样 ?谢谢
答案 0 :(得分:2)
您问题中列出的文件是块设备(权限块中第一个字符b
会告诉您)。
这意味着112
和24
是第一个文件的主要版本和次要版本,以十进制表示法。
Unix命令stat
可用于生成使用自定义格式的文件列表(与ls
相反,后者仅知道几种固定格式)。
您需要的命令行是:
stat --format "%t %n" /toto/*
%t
format specifier以十六进制表示形式列出设备文件的主要版本。 %n
列出了文件名(我们将其用于调试)。
112
是0x70
。上面的命令应打印:
70 file1
70 file2
现在,您可以将其通过grep '^70 '
传递给wc -l
,以计算以70
开头的行数(70
后跟一个空格):>
stat --format "%t %n" /toto/* | grep '^70 ' | wc -l
如果您想知道/toto/
目录中的所有文件是否都具有主版本112
,则可以将上面命令产生的数字与下一个命令产生的数字进行比较(它会产生/toto/
目录中的文件和目录数)
ls -1 /toto/ | wc -l
如果您还想知道哪些文件具有不同的主版本,则可以运行以下命令:
stat --format "%t %n" /toto/* | grep -v '^70 '
它将过滤出不以^70
开头的行,并仅显示具有不同主要版本(及其主要版本以十六进制表示)的文件。
如果不显示任何内容,则/toto/
目录中的所有文件的主要版本为112
。
备注::上面的命令还将列出常规文件和目录以及不是设备的其他文件(仅设备具有版本)。