任务:
1)在目录中的文件中找到字符串“decor”
2)获取每个包含 decor 的文件中 decor 的出现次数
问题的第一部分已部分解决,find . -type f | grep -i decor *
但这似乎不适grep
用于从中找到的所有文件find
,而是当前目录顶部的文件。
我是否必须使用除*
for之外的其他东西grep
来 grep 从 find 中找到的文件?
需要通过管道传输什么才能显示文件名以及每个文件的装饰出现次数?
答案1
你可以做:
find . -type f -exec grep -icH decor {} \; | grep -v :0\$
这将获取每个匹配的文件名和计数,并使用管道 egrep 删除计数为 0 的文件
答案2
“目录中的文件”通常并不意味着“递归地访问子目录”。我只会使用
grep -c decor *
如果您也需要搜索子目录,则可以使用 find,但命令的连接方式不同:pipe 只是将第一个命令的输出连接到第二个命令的输入。但是,Grep 并不期望其输入中包含文件列表。
find . -type f -exec grep -cH decor {} + | grep -v :0
答案3
您可以使用 -exec 选项。
find . -type f -exec grep decor {} \;
或者使用 xargs
find . -type f | xargs -i grep decor {}
答案4
TMTOWTDI - 我喜欢看其他变体,所以这里也是我的:
$ find . -type f -exec egrep -li decor {} \;
$ perl -e '$c=0; while(<>){$c++ if /decor/;} continue {if(eof){print("$ARGV:$c\n"); close ARGV; $c=0;} }' *
只是因为我想重写一个 Perl 1-liner,它执行的功能与awk
从柯尼汉和派克。