1 votos

Linux busca texto en archivos con el mismo nombre en varias carpetas (maxdepth 2) y genera un archivo de informe

Situación: En Linux, tengo una carpeta principal con 22 carpetas de varios nombres, cada uno con un archivo de un determinado nombre asset.xml. También en estas carpetas son cientos de otras carpetas con asset.xmlde ellos, pero estas son las versiones anteriores y no estoy interesado en ellos. Tengo que buscar dentro de cada archivo de 3 tags "legend|assetID|name" y devolución de la información dentro de estas etiquetas. Por lo general están en la misma línea, así que creo Grep está bien.

Lo que he intentado:

grep -nr -E "legend|assetID|name" . > /dir/to/the/ReportFile.txt

Esta toma demasiado tiempo y volver demasiado duplicado de datos, así que esto no es práctico.

find . -maxdepth 2 -exec grep -E "legend|assetID|name" . > /dir/to/the/ReportFile.txt

Esta devuelve un error con -exec falta de un argumento, de modo que el archivo de salida estaba vacía.

find . -maxdepth 2 -| grep -E "legend|assetID|name" . > /dir/to/the/ReportFile.txt

Esta devuelve el vacío de un archivo de salida.

Pregunta: ¿Cómo puedo ir a través de cada uno como nombre de archivo de cada uno dentro de varias carpetas con nombres (que también tienen otras subcarpetas con archivos con el mismo nombre) y extraer la información dentro de los 3 etiquetas y escribir datos en un archivo de salida?

1voto

Joe Puntos 28

Acabo de encontrar la solución.

 grep -nr -E "legend|assetID|name" /dir/to/the/*/asset.xml > /dir/to/the/ReportFile.txt
 

El * en la ruta es el "comodín" que necesitaba para recorrer cada directorio. Creo que solo va a ese directorio y no a una carpeta más profunda ...?

1voto

Rufo Puntos 121

Su línea de comandos con find era casi correcta :-)

El archivo(s) encontrado por find está representado por {}. El -exec parte de la búsqueda de la línea de comandos debe ser terminado de alguna manera, con el \; o, a menudo, mejor con + que invoca grep sólo una vez, y me sugieren que ejecute grep sólo en los archivos normales -type f, trate de

find . -maxdepth 2 -type f -exec grep -E "legend|assetID|name" {} + > ../output

Puede que desee especificar el nombre de archivo asset.xml

find . -maxdepth 2 -type f -name asset.xml -exec grep -E "legend|assetID|name" {} + > ../output

Compruebe el resultado con

cat ../output

Es posible que desee modificar el maxdepth a 3 o lo que es adecuado.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: