bash列表文件(ls)并找到一个数字

时间:2019-04-18 14:00:33

标签: bash grep ls

我的目录中有此文件

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

为什么?怎么样 ?谢谢

1 个答案:

答案 0 :(得分:2)

您问题中列出的文件是块设备(权限块中第一个字符b会告诉您)。

这意味着11224是第一个文件的主要版本和次要版本,以十进制表示法。

Unix命令stat可用于生成使用自定义格式的文件列表(与ls相反,后者仅知道几种固定格式)。

您需要的命令行是:

stat --format "%t %n" /toto/*

%t format specifier以十六进制表示形式列出设备文件的主要版本。 %n列出了文件名(我们将其用于调试)。

十六进制的

1120x70。上面的命令应打印:

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

备注::上面的命令还将列出常规文件和目录以及不是设备的其他文件(仅设备具有版本)。