Contando las apariciones de caracteres en un árbol de sistema de archivos

Contando las apariciones de caracteres en un árbol de sistema de archivos

La tarea consistía en encontrar el número de apariciones del carácter 'a' en todos los archivos del directorio (de forma recursiva).

Mi guión era este

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

pero falló: obtuve el resultado 0, incluso en mi computadora local funcionó.

¿Qué hay de malo en este guión? Supongo que no es a prueba de balas o algo así. ¿Cómo podría hacerlo a prueba de balas o correcto?

Respuesta1

Supongo que la máquina problemática grepno admite -o.

Si este es el caso, entonces su línea de comando genera un mensaje de error cada vez que findejecuta execs grep. Sin embargo, con el error estándar redirigido a /dev/null, los gritos caen en oídos sordos.

wcno recibe un solo byte, lo que resulta en un recuento de líneas de 0, porque grepsale inmediatamente.

Intente ejecutar su canalización sin una redirección stderr o con la redirección a un archivo de registro. Si estoy en lo cierto, debería ver un mensaje de error por cada archivo encontrado por find.

Por si te resulta útil, aquí tienes una alternativa que no utiliza grep:

find . -type f -exec cat {} \; | tr -cd a | wc -m

Si admite findla alternativa ejecutiva más eficiente +:

find . -type f -exec cat {} + | tr -cd a | wc -m

Respuesta2

Hice esto:

find "${directory-.}" -type f -print0 | xargs -0 -r cat | grep -F -o 'a' | wc -l

que es prácticamente lo mismo que su comando y obtuvo un resultado distinto de cero. ¿Estás en el directorio que creías que estabas? ¿Y realmente estás buscando a? Si no, sugiero grep -F(como he usado) o fgrepbuscar una cadena fija en lugar de una expresión regular.

Puedes simplificar aún más con grep -r(grep recursivo):

grep -Fro 'a' "${directory-.} | wc -l

Desafortunadamente, no puedes grepcontar, ya que grep -o -ccuenta líneas en lugar de ocurrencias; lo considero un error.

información relacionada