
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 grep
no admite -o.
Si este es el caso, entonces su línea de comando genera un mensaje de error cada vez que find
ejecuta execs grep
. Sin embargo, con el error estándar redirigido a /dev/null, los gritos caen en oídos sordos.
wc
no recibe un solo byte, lo que resulta en un recuento de líneas de 0, porque grep
sale 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 find
la 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 fgrep
buscar 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 grep
contar, ya que grep -o -c
cuenta líneas en lugar de ocurrencias; lo considero un error.