任务是查找目录中所有文件中字符“a”的出现次数(递归)。
我的脚本是这样的
find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l
但它失败了:即使在我的本地计算机上它也能工作,我也得到了结果 0。
这个脚本有什么问题?我猜它不是防弹的或者什么的。我怎样才能使它防弹或正确?
答案1
我的猜测是有问题的机器grep
不支持-o。
如果是这种情况,那么您的命令行每次find
execs都会生成一条错误消息grep
。然而,随着标准错误重定向到 /dev/null,人们的呼声被置若罔闻。
wc
没有接收到单个字节,导致行计数为 0,因为grep
立即退出。
尝试在不使用 stderr 重定向或重定向到日志文件的情况下运行管道。如果我是正确的,您应该会看到由 找到的每个文件一条错误消息find
。
如果您发现它有用,这里有一个不使用的替代方案grep
:
find . -type f -exec cat {} \; | tr -cd a | wc -m
如果您find
支持更有效的+
执行替代方案:
find . -type f -exec cat {} + | tr -cd a | wc -m
答案2
我这样做了:
find "${directory-.}" -type f -print0 | xargs -0 -r cat | grep -F -o 'a' | wc -l
这与您的命令几乎相同,并且得到非零结果。您是否在您认为的目录中?你真的在寻找吗a
?如果没有,我建议grep -F
(正如我所使用的那样)或fgrep
搜索固定字符串而不是正则表达式。
您可以使用grep -r
(递归 grep)进一步简化:
grep -Fro 'a' "${directory-.} | wc -l
不幸的是,你无法grep
进行计数,因为grep -o -c
计数行而不是出现次数 - 我认为这是一个错误。