Mieux vaut expliquer sur des exemples.

Je peux:

find . -name "*.py" -type f > output.txt 

Mais comment puis-je stocker la sortie dans le même fichier pour:

find . -name "*.py" -type f -exec grep "something" {} \ 

Je ne peux « pas simplement faire

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt 

Réponse

Si je vous comprends bien, voici ce que vous voulez faire:

find . -name "*.py" -print0 | xargs -0 grep "something" > output.txt 

Rechercher tous les fichiers avec lextension .py, grep uniquement les lignes contenant something et enregistrez les lignes dans output.txt. Si le fichier output.txt existe, il sera tronqué, sinon il sera créé.

En utilisant -exec:

find . -name "*.py" -exec grep "something" {} \; > output.txt 

Jincorpore Chris Downs commentez ici: La commande ci-dessus entraînera lexécution de grep autant de fois que find trouve des chemins qui passent les tests donnés (seulement le test ci-dessus). Cependant, si vous remplacez \; par un +, grep est appelé avec plusieurs chemins de find (jusquà une certaine limite).

Voir la question Utilisation du point-virgule (;) vs plus ( +) avec exec dans find pour en savoir plus sur le sujet.

Commentaires

  • Utilisez + au lieu de \;, cela améliorera considérablement le temps dexécution (car il contaténera les arguments avant lexécution jusquà ARG_MAX).
  • Maintenant, je comprends le pouvoir des xargs! Merci!
  • Utilisez grep -H si vous souhaitez inclure le nom de fichier du fichier dans la sortie.
  • Utilisez loption 1. Et ajoutez LC_ALL=C juste avant xargs pour obtenir beaucoup de vitesse supplémentaire. Et vous pouvez utiliser un indicateur -P6 sur xargs pour exécuter en parallèle (dans ce cas) 6 processus (nhésitez pas à changer le nombre de 6 à quelque chose de supérieur ou inférieur, pour voir ce qui est ' plus rapide sur votre machine et sur votre recherche). Référence: unix.stackexchange.com/questions/131535/…
  • Utilisation de + au lieu de \; transmettra plusieurs fichiers à grep, et si un fichier de cet ensemble contient le texte ' quelque chose ', tous ces fichiers passeront le test. Donc, ' ne fera pas ce que vous voulez.

Réponse

Si vous souhaitez enregistrer toutes les lignes correspondantes dans tous les fichiers de output.txt, votre dernière commande fonctionne, sauf que vous « manquez le ; à la fin de la commande.

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt 

Si vous voulez que chaque exécution de grep produise sortie vers un autre fichier, exécutez un shell pour calculer le nom du fichier de sortie et effectuer la redirection.

find . -name "*.py" -type f -exec sh -c "grep "something" <"$0" >"$0.txt"" {} \; 

Commentaires

  • le dernier vraiment sympa: D
  • Pour développer la réponse @gilles pour le rendre un peu plus informatif, surtout si la liste des fichiers que vous ' si le traitement est volumineux, vous pouvez indiquer le nom de fichier (chemin relatif) de chaque fichier avec les résultats de grep ' ed en utilisant ceci: find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt Et si vous ' aimeriez vous e les numéros de ligne des lignes grep ' ed, vous pouvez bien sûr utiliser grep -n "something"

Réponse

Pour mémoire, grep a --include et --exclude arguments que vous pouvez utiliser pour filtrer les fichiers dans lesquels il recherche:

grep -r --include="*.py" "something" > output.txt 

Commentaires

  • Au moins GNU grep fait.

Réponse

Utilisez tee:

find . -name "*.py" | tee output.txt | xargs grep "something" 

La mise en garde, cest si vous avez des fichiers avec des caractères spéciaux (y compris les espaces) avec lesquels xargs et grep ne fonctionneront pas bien (a file.txt sera interprété comme deux fichiers, a et file.txt). Lalternative consiste à utiliser soit -x soit -print0, mais lun ou lautre polluera votre output.txt. -x utilisera \ pour échapper certains caractères spéciaux et ce sera dans output.txt.-print0 utilisera un octet nul comme séparateur de champ (ce qui nécessite également xargs -0) et output.txt ressemblera à une longue ligne de texte contiguë.

La façon dont vous gérez (ou ne le faites pas) dépend de vous.

Réponse

grep -n CThread "`find . -name "*.cpp"`" 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *