计算文件系统树中字符的出现次数

计算文件系统树中字符的出现次数

任务是查找目录中所有文件中字符“a”的出现次数(递归)。

我的脚本是这样的

find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l

但它失败了:即使在我的本地计算机上它也能工作,我也得到了结果 0。

这个脚本有什么问题?我猜它不是防弹的或者什么的。我怎样才能使它防弹或正确?

答案1

我的猜测是有问题的机器grep不支持-o。

如果是这种情况,那么您的命令行每次findexecs都会生成一条错误消息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计数行而不是出现次数 - 我认为这是一个错误。

相关内容