Si te entiendo correctamente, esto es lo que quieres hacer:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
todos los archivos con extensión py
, grep
solo las filas que contienen something
y guardan las filas output.txt
. Si el archivo contiene algo, será reemplazado.
Editar: Usando -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Estoy incorporando el comentario de Chris Downs aquí. El comando anterior dará como resultado que grep
se ejecute tantas veces como find
encuentre ocurrencias. Sin embargo, si reemplaza el ;
con a +
, grep
se llama con la salida de find
concatenado (hasta cierto límite). Vea la pregunta Usando punto y coma (;) vs plus (+) con exec en find para más información sobre el tema.
+
lugar de\;
mejorará significativamente el tiempo de ejecución (ya que contaminará los argumentos antes de la ejecución hastaARG_MAX
).grep -H
si desea incluir el nombre de archivo del archivo en la salida.Si desea guardar todas las líneas coincidentes en todos los archivos
output.txt
, su último comando funciona, excepto que le falta el requerido;
al final del comando.Si desea que cada ejecución de
grep
produzca resultados en un archivo diferente, ejecute un shell para calcular el nombre del archivo de resultados y realizar la redirección.fuente
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
Y si desea ver los números de línea de las líneas grep'ed que puede, por supuesto, usargrep -n "something"
Para el registro,
grep
has--include
y--exclude
argumentos que puedes usar para filtrar los archivos que busca:fuente
grep
hace.Uso
tee
:La advertencia, es si tiene algún archivo con caracteres especiales (incluyendo espacios) que
xargs
ygrep
no va a funcionar bien con (a file.txt
será interpretado como dos archivos,a
yfile.txt
). La alternativa a eso es usar el-x
o-print0
, pero cualquiera de ellos contaminará suoutput.txt
. Se-x
utilizará\
para escapar de ciertos caracteres especiales y esto estará enoutput.txt
. La-print0
utilizará un byte nulo como separador de campos (que también requierexargs -0
) youtput.txt
se verá como una larga fila contigua de texto.La forma en que trates (o no) con esto depende de ti.
fuente