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
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 utilisergrep -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"`"
+
au lieu de\;
, cela améliorera considérablement le temps dexécution (car il contaténera les arguments avant lexécution jusquàARG_MAX
).grep -H
si vous souhaitez inclure le nom de fichier du fichier dans la sortie.LC_ALL=C
juste avantxargs
pour obtenir beaucoup de vitesse supplémentaire. Et vous pouvez utiliser un indicateur-P6
surxargs
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/…+
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.