Je travaille sur l'écriture de certains scripts dans grep
certains répertoires, mais ces répertoires contiennent toutes sortes de types de fichiers.
Je veux grep
juste .h
et .cpp
pour l'instant, mais peut-être quelques autres à l'avenir.
Jusqu'à présent, j'ai:
{ grep -r -i CP_Image ~/path1/;
grep -r -i CP_Image ~/path2/;
grep -r -i CP_Image ~/path3/;
grep -r -i CP_Image ~/path4/;
grep -r -i CP_Image ~/path5/;}
| mailx -s GREP [email protected]
Quelqu'un peut-il me montrer comment j'ajouterais maintenant uniquement les extensions de fichier spécifiques?
grep -r -i CP_Image ~/path1/*.{h,cpp}
?ag -i CP_Image ~/path[1-5] | mailx -s GREP [email protected]
. Travail accompli.-r
à lagrep
recherche de fichiers car cela rompt le mantra UNIX d'avoir des outils qui "font une chose et le font bien". Il existe un excellent outil pour rechercher des fichiers avec un nom TRÈS évident.Réponses:
Utilisez simplement le
--include
paramètre, comme ceci:cela devrait faire ce que vous voulez.
Pour prendre l'explication de la réponse de HoldOffHunger ci-dessous:
grep
: commande-r
: récursivement-i
: ignore-case--include \*.cpp
: tous * .cpp: fichiers C ++ (échappez avec \ juste au cas où vous auriez un répertoire avec des astérisques dans les noms de fichiers)./
: Commence au répertoire actuel.la source
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
grep -r -i --include="*.h" --include="*.cpp" CP_Image
Certaines de ces réponses semblaient trop lourdes en syntaxe, ou elles ont généré des problèmes sur mon serveur Debian. Cela a parfaitement fonctionné pour moi:
Révolution PHP: Comment grep des fichiers sous Linux, mais seulement certaines extensions de fichiers?
À savoir:
... ou version insensible à la casse ...
grep
: commande-r
: récursivement-i
: ignore-case--include
: all * .txt: fichiers texte (échapper avec \ juste au cas où vous auriez un répertoire avec des astérisques dans les noms de fichiers)'searchterm'
: Que rechercher./
: Commence au répertoire actuel.la source
*
utilisation de\*.cpp
ou'*.cpp'
. Sinon, il ne donnera pas le résultat attendu lorsque le répertoire de travail contient des*.txt
fichiers.--include=<pattern>
mais il est important de s'échapper*
avec--include <pattern>
(un espace au lieu de=
) qui semble très similaire autrement.la source
--include
option après l'aiguille, pas avec d'autres options?--
?Que diriez-vous:
la source
-name
arguments. des choses étranges peuvent arriver si vous ne le faites pas.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
find
peut éventuellement regrouper les arguments, réduisant au minimum les invocations du processus appelé.find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} +
Ceci est suggéré mais non mis en évidence dans la réponse de @ fedorqui ci-dessous et constitue une amélioration intéressante. L'-H
argument de grep ici est utile lorsque find identifie uniquement un seul fichier correspondant. Cela pourrait éliminer l'utilisation de-print
dans la réponse. Si votre liste totale de fichiers est suffisamment petite, l'utilisation d'un glob de shell récursif (par exemple.{path1,path2}/**/*.{cpp,h}
) Peut être préférable.Il n'y a pas d'option -r sur les serveurs HP et Sun, cela a fonctionné pour moi sur mon serveur HP
-i est pour la recherche de chaîne insensible à la casse
la source
ll
mais n'ajoute pas--color=auto
à grep.Comme il s'agit de trouver des fichiers, utilisons-le
find
!GNU vous trouver en utilisant pouvez utiliser l'
-regex
option pour trouver ces fichiers dans l'arborescence des répertoires dont l' extension est soit.h
ou.cpp
:Ensuite, il s'agit juste d'exécuter
grep
sur chacun de ses résultats:Si vous n'avez pas cette distribution de find, vous devez utiliser une approche comme Amir Afghani , en utilisant
-o
pour concaténer les options ( le nom se termine par.h
ou avec.cpp
):Et si vous voulez vraiment l'utiliser
grep
, suivez la syntaxe indiquée pour--include
:la source
Le moyen le plus simple est
la source
ag
(le chercheur d'argent) a une syntaxe assez simple pour celadonc
la source
ag _string_to_find_ -G _filename_regex_
La réponse ci-dessous est bonne:
Mais peut être mis à jour pour:
Ce qui peut être plus simple.
la source
Doit écrire "-exec grep" pour chaque "-o -name"
Ou regroupez-les par ()
l'option '-Hn' affiche le nom et la ligne du fichier.
la source
Je suis au courant de cette question est un peu daté, mais je voudrais partager la méthode que je l' utilise normalement pour trouver .c et .h fichiers:
ou si vous avez également besoin du numéro de ligne:
la source