¿Cómo puedo encontrar una palabra en archivos específicos que coincidan con un patrón? p.ej. buscando version
en CMake*
archivos encontrados recursivamente en el directorio actual.
Respuesta aceptada:
Si desea ver el nombre del archivo y el número de línea, POSIXly:
find . -name 'CMake*' -type f -exec grep -nF /dev/null version {} +
(no quieres usar ;
aquí, que ejecutaría un grep
por archivo). Ese es el equivalente estándar del GNUismo:
find . -name 'CMake*' -type f -print0 | xargs -r0 grep -nHF {} +
find
(en el primero), xargs
(en el segundo) pasará tantos argumentos a grep
como sea posible sin exceder el límite en el número de argumentos que puede pasar a un comando. Al hacer esa división, podría suceder que para la última ejecución, solo se pase un argumento a grep
en cuyo caso grep
no imprimía el nombre del archivo. Por eso necesitas /dev/null
allí (o -H
con GNU grep
).
Con -type f
, solo estamos considerando archivos normales (no dispositivos, enlaces simbólicos, conductos, directorios...).
Si quiere usar GNUisms, puede usar GNU grep
capacidad de descender un árbol de directorios:
grep -rHnF --include='CMake*' version .
No quieres usar -R
ya que eso causa grep
para seguir enlaces simbólicos al descender en el árbol de directorios y leer desde dispositivos, fifos, sockets...
Esa versión es más segura y eficiente, pero no portátil.