Si je vous comprends bien, voici ce que vous voulez faire:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
tous les fichiers avec extension py
, grep
uniquement les lignes qui contiennent something
et sauvegardent les lignes dans output.txt
. Si le fichier contient quelque chose, il sera remplacé.
Edit: Utiliser -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
J'incorpore le commentaire de Chris Downs ici. La commande ci-dessus entraînera l' grep
exécution autant de fois que d' find
occurrences de la recherche. Toutefois, si vous remplacez le ;
par un +
, grep
est appelé avec la sortie find
concaténée (jusqu'à une certaine limite). Voir la question Utilisation du point-virgule (;) vs plus (+) avec exec dans find pour plus d'informations à ce sujet.
+
au lieu de\;
, cela améliorera considérablement le temps d'exécution (puisqu'il contaténera les arguments avant l'exécution jusqu'àARG_MAX
).grep -H
si vous souhaitez inclure le nom de fichier du fichier dans la sortie.Si vous souhaitez enregistrer toutes les lignes correspondantes dans tous les fichiers
output.txt
, votre dernière commande fonctionne, sauf qu'il vous manque l'élément requis;
à la fin de la commande.Si vous voulez que chaque exécution de
grep
génère une sortie dans un fichier différent, exécutez un shell pour calculer le nom du fichier de sortie et effectuer la redirection.la source
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
Et si vous souhaitez voir les numéros de ligne des lignes grises, vous pouvez bien sûr utilisergrep -n "something"
Pour l'enregistrement,
grep
a--include
et les--exclude
arguments que vous pouvez utiliser pour filtrer les fichiers qu'il recherche:la source
grep
fait.Utiliser
tee
:La mise en garde, est de savoir si vous avez des fichiers avec des caractères spéciaux (y compris les espaces) qui
xargs
etgrep
ne fonctionne pas bien avec (a file.txt
sera interprété comme deux fichiers,a
etfile.txt
). L'alternative à cela est d'utiliser le-x
ou-print0
, mais l'un ou l' autre vous pollueraitoutput.txt
. Le-x
utilisera\
pour échapper à certains caractères spéciaux et ce sera dansoutput.txt
. Le-print0
utilisera un octet nul en tant que séparateur de champ (ce qui nécessite égalementxargs -0
) etoutput.txt
ressemblera à une longue ligne de texte contiguë.Comment vous traitez (ou pas) avec ceci est à vous.
la source