Você poderia usar
find /proc/[0-9]*/fd/ -name 24 2> /dev/null | wc -l
Ou, se você insistir em usar ls (este deve ser um dos poucos exemplos onde é seguro fazer então):
ls /proc/[0-9]*/fd 2>/dev/null | grep -c '^24$'
Sua primeira tentativa falhou porque você estava redirecionando a saída para um arquivo ( > output.txt ), o que significa que o grep nunca seria igual, pois não tinha saída para correspondência. Você pode usar pipes ( | ) como eu fiz acima ou usar um ; ou & para separar os comandos:
ls /proc/[0-9]*/fd 2> errors.txt > stdout.txt; grep "^24" stdout.txt | wc -l