Aqui está outro truque; isso faz com que o stderr imprima os resultados, porque ele usa stdout para capturar os totais recursivos de quaisquer subdiretórios.
function countdirhelper {
count=0
string=$1
for f in *
do
if [ -f "$f" ]
then
add=$(grep -c -- "$string" "$f")
elif [ -d "$f" ]
then
add=$(cd "$f"; countdirhelper "$string")
fi
count=$((count + add))
done
printf "%s: %d\n" "$PWD" "$count" >&2
printf %d "$count"
}
function countdir {
countdirhelper "$1" > /dev/null
}