我在我的目录中有这个文件
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
为什么?怎么样 ?谢谢
您问题中列出的文件是块设备(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
。
备注:上面的命令还会列出常规文件和目录以及非设备的其他文件(只有设备有版本)。