Pregunta:
Estoy usando find
y obteniendo una lista de archivos que quiero grep
. ¿Cómo canalizo esa lista a grep
?
Respuesta:
Bueno, el caso genérico que funciona con cualquier comando que escribe en stdout es usar xargs
, que le permitirá adjuntar cualquier número de argumentos de línea de comando al final de un comando:
$ find … | xargs grep 'search'
O para incrustar el comando en su línea grep
con comillas invertidas o $()
, que ejecutará el comando y sustituirá su salida:
$ grep 'search' $(find …)
Tenga en cuenta que estos comandos no funcionan si los nombres de los archivos contienen espacios en blanco u otros “caracteres extraños” ( \'"
para xargs, \[*?
Para $(find …)
).
Sin embargo, en el caso específico de find
la capacidad de ejecutar un programa en los argumentos dados está incorporada:
$ find … -exec grep 'search' {} \;
Todo entre -exec
y ;
es el comando a ejecutar; {}
se reemplaza con el nombre de archivo encontrado por find
. Eso ejecutará un grep
separado para cada archivo; dado que grep
puede tomar muchos nombres de archivo y buscarlos en todos, puede cambiar el ;
a +
para decirle a find que pase todos los nombres de archivo coincidentes a grep
a la vez:
$ find … -exec grep 'search' {} \+