1 votes

Linux recherche du texte dans des fichiers de même nom dans plusieurs dossiers (profondeur maximale 2) et génère un fichier de rapport.

Situation : Sous Linux, j'ai un dossier parent avec 22 dossiers de noms différents, chacun contenant un fichier d'un nom particulier. asset.xml . Dans ces dossiers se trouvent également des centaines d'autres dossiers avec asset.xml mais ce sont des versions antérieures et elles ne m'intéressent pas. J'ai besoin de rechercher dans chaque fichier 3 balises "legend|assetID|name" et renvoie les informations contenues dans ces balises. Elles sont généralement sur la même ligne, donc je pense que Grep c'est bon.

Ce que j'ai essayé :

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

Cela prend beaucoup trop de temps et renvoie beaucoup trop de données dupliquées, ce qui n'est pas pratique.

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

Cela a retourné une erreur avec -exec manquant un argument, donc le fichier de sortie était vide.

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

Ceci a retourné un fichier de sortie vide.

Question : Comment puis-je parcourir chaque fichier de même nom dans des dossiers de noms différents (qui ont aussi d'autres sous-dossiers avec des fichiers de même nom) et extraire les informations dans les 3 balises et écrire ces données dans un fichier de sortie ?

1voto

LHo Points 143

Je viens de trouver la solution.

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

Le site * dans le chemin est le "joker" dont j'avais besoin pour parcourir chaque répertoire. Je pense qu'il ne va que dans ce répertoire et pas dans un dossier plus profond... ?

1voto

sudodus Points 39902

Votre ligne de commande avec find était presque correct :-)

Le(s) fichier(s) trouvé(s) par find est représenté par {} . Le site -exec de la ligne de commande find doit être terminée d'une manière ou d'une autre, avec \; ou souvent mieux avec + qui invoque grep qu'une seule fois, et je vous suggère d'exécuter grep uniquement sur les dossiers normaux -type f essayez.

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

Vous pouvez spécifier le nom du fichier asset.xml

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

Vérifiez le résultat avec

cat ../output

Vous pouvez modifier la profondeur maximale à 3 ou à toute autre valeur appropriée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X