Haz todo lo posible por entender el código bien antes de adaptarlo a tu trabajo y si tquieres aportar algo puedes compartirlo con nosotros.
Solución:
Puede usar un comando de shell complejo en el argumento para exec invocando explícitamente un shell allí.
find . -type f -name "*.txt" -exec sh -c 'grep FirstKeyWord "$1" | grep SecondKeyWord' -- ;
Esto ejecuta sh
con la lista de comandos provista para cada archivo, pasando el nombre del archivo en $1
.
EDITAR: El OP señala que esto funciona y es más simple:
find . -type f -name "*.txt" -exec sh -c 'grep FirstKeyWord | grep SecondKeyWord' ;
Para su ejemplo específico, puede hacer esto:
find . -type f -name "*.txt" -exec grep FirstKeyWord ; | grep "SecondKeyWord"
Por cierto, esto también se puede hacer sin usar un segundo grep. En su lugar, utilice egrep
con las dos alternativas de FirstKeyWord
seguido por SecondKeyWord
o SecondKeyWord
seguido por FirstKeyWord
:
find . -type f -name "*.txt" -exec egrep "FirstKeyWord.*SecondKeyWord|SecondKeyWord.*FirstKeyWord" ;
Si puede hacer algunas garantías sobre los nombres de ruta resultantes de la find
(como sin espacios iniciales o internos y sin nuevas líneas en los nombres de ruta), también puede hacerlo de esta manera:
find . -type f -name "*.txt" -print | while read filename; do grep "FirstKeyWord" "$filename" | grep "SecondKeyWord"; done
La respuesta más general es “no se puede” directamente de find
. Comandos de tubería o usando &&
o ||
es una función del shell, no una función de ejecutar procesos.
He usado este patrón antes, pero es frágil y más complejo:
find . -type f -name "*.txt" -print
| sed -e 's;[\$"`!];\&;g'
-e 's;^.*$;grep "FirstKeyWord" "&" | grep "SecondKeyWord";'
| sh
Imprima cada nombre de archivo, utilice sed
para transformarlo en un script de shell sobre la marcha (teniendo cuidado de escapar de los caracteres en el nombre de archivo que podrían causar problemas cuando están encerrados entre comillas dobles de shell), luego ejecute el resultado a través del shell.
La otra solución es crear un script de shell que realice su procesamiento y llamar a ese script de shell desde find:
$ cat grepit.sh
#!/bin/sh
grep "FirstKeyWord" "$1" | grep "SecondKeyWord"
$ find . -type f -name "*.txt" -exec sh grepit.sh ;
Ten en cuenta mostrar esta reseña si te valió la pena.