Je veux trouver tous les fichiers contenant une chaîne de texte spécifique. La grep
commande fonctionne, mais je ne sais pas comment l'utiliser pour tous les répertoires (je ne peux le faire que pour mon répertoire actuel). J'ai essayé de lire man grep
, mais cela ne m'a pas aidé.
command-line
grep
Smile.Hunter
la source
la source
--include="*.C"
Caractère générique avec l' option, @ user311346, grâce à @Lekensteyn.Réponses:
Il serait préférable d'utiliser
où
-r
(ou--recursive
) permet de parcourir également tous les sous-répertoires de/path
, alors que-l
(ou--files-with-matches
) option est utilisée pour imprimer uniquement les noms de fichiers des fichiers correspondants, et non les lignes correspondantes (cela pourrait également améliorer la vitesse, étant donné que lagrep
lecture d'un fichier lors de la première correspondance avec cette option).la source
-rlF
commutateurs,-F
pour "chaîne fixe" (et non pas regexp - par exemple). Bien sûr, si la tâche utilisait les expressions rationnelles, alors excusez-moi. Bien sûr, la même théorie sans -r aussi, je vois souvent que les gens partent du principe que grep cherche "texte" et que cela peut poser des problèmes particuliers, qui signifient quelque chose comme une expression rationnelle.-i
drapeau qui ignore la casse.--recursive
option, il y a une tonne d'options et de scénarios d'utilisation dont on peut parler. J'ai commencé à partir de la réponse acceptée de @dmityugov et modifié pour fonctionner sansfind
.--include '*.h'
Si vous recherchez des lignes correspondant aux fichiers, ma commande préférée est:
-H
provoque l'impression du nom de fichier (implicite lorsque plusieurs fichiers sont recherchés)-r
fait une recherche récursive-n
provoque l'impression du numéro de lignepath/to/files
peut être.
de chercher dans le répertoire courantAutres options que je trouve très utiles:
-I
ignorer les fichiers binaires (complément:-a
traiter tous les fichiers en tant que texte)-F
traitersearch term
comme un littéral, pas une expression régulière-i
faire une recherche insensible à la casse--color=always
pour forcer les couleurs, même en passant à traversless
. Pour créerless
des couleurs de support, vous devez utiliser l'-r
option:--exclude-dir=dir
utile pour exclure des répertoires comme.svn
et.git
.la source
-H
sur un dossier est redondant, s'il y a plus d'un fichier, comme cela est probable. En fait, la page de manuel dit-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
Je crois que vous pouvez utiliser quelque chose comme ceci:
Explication des commentaires
find
est une commande qui vous permet de rechercher des fichiers et d'autres objets tels que des répertoires et des liens dans les sous-répertoires d'un chemin donné. Si vous ne spécifiez pas de masque que les noms de fichiers doivent rencontrer, il énumère tous les objets de répertoire.-type f
spécifie qu'il ne devrait traiter que des fichiers, pas des répertoires, etc.-exec grep
spécifie que pour chaque fichier trouvé, il doit exécuter la commande grep, en lui passant son nom de fichier en tant qu'argument, en le remplaçant{}
par le nom de fichierla source
-name '*.py'
limite les correspondances aux fichiers se terminant par '.py'.... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Ma commande par défaut est
J'utilise un Capitole 'R' parce que
ls
je l'utilise pour le traitement récursif. Puisque grep accepte les deux, aucune raison de ne pas l'utiliser.EDIT: par HVNSweeting, apparemment
-R
suivra des liens symboliques où ne le-r
fera pas.la source
shopt -s dotglob
(rappelez-vous-s
comme "set"). Soyez prudent lorsque vous supprimez des fichiers alors. Si vous avez activé dotglob,rm -r *
supprime tout ce qui se trouve dans le répertoire en cours, mais aussi le répertoire situé au-dessus, car les..
correspondances. Pour désactiver dotglob, utilisezshopt -u dotglob
("unset"). Les modifications sont temporaires mais ne s’appliquent qu’au shell actuel.shopt -s dotglob & <grep cmd> & shopt -y dotglob
seulement plus pratique? De cette façon, nous n'aurons pas à nous soucier de le réinitialisergrep -Rin string .
dans la plupart des cas. Je viens d'utiliser * parce que cela semble venir plus naturellement.R
suivre les liens symboliques,r
mais pasSi vous êtes prêt à essayer quelque chose de nouveau, tentez
ack
votre chance. La commande pour rechercher récursivement le répertoire actuelstring
est la suivante:L'installation est assez simple:
(À condition que vous ayez déjà le répertoire
~/bin
et qu'il soit de préférence dans votrePATH
.)la source
chmod
commande? Sont-ils spécifiqueschmod
ou sont-ils liés à la bash (la!#:3
partie)?!
est un indicateur d' événement . Ils sont assez puissants pour éviter les répétitions.!#:3
fait référence au troisième jeton de la ligne de commande jusqu'à présent, c'est-~/bin/ack
à- dire dans ce cas.La commande rgrep est dédiée à ce besoin
Si non disponible, vous pouvez l'obtenir comme ceci
Vous pouvez directement définir vos options grep par défaut comme décrit ci-dessus.
J'utilise personnellement
Sujet connexe: comment utiliser toujours rgrep couleur
la source
Mise à jour 2:
Cette ligne de commandes utilisant
find
etgrep
corrige le problème:--color=<always or auto>
pour une sortie en couleur:Exemple:
Un exemple exécuté dans l'instantané ci-dessous:
Mise à jour 1:
Vous pouvez essayer le code suivant. en fonction de votre
.bashrc
ou.bash_aliases
ou dans un script:Usage:
wherein /path/to/search/in/ searchkeyword
exemple:
(Remarque: comme @enzotib le suggère dans les commentaires ci-dessous, cela ne fonctionne pas avec les fichiers / répertoires incluant des espaces dans leurs noms.)
Original post
Pour rechercher la chaîne et afficher uniquement cette ligne avec la chaîne de recherche:
par exemple:
Pour afficher le nom de fichier contenant la chaîne de recherche:
par exemple:
la source
grep
, à côté du sous-ensemble utilisantfind
avecgrep
... probablement le mien conviendra ici aussi .. ou êtes-vous différent? la dernière mise à jour fait ce que je voudrais dans ma recherche: noms de fichiers avec des lignes avec la clé de recherche et numéro de ligne. too :) et une sortie colorée et un filtre d'erreur pour une meilleure lisibilité ..grep
( GNU ou BSD )Vous pouvez utiliser
grep
tool pour rechercher de manière récursive le dossier actuel avec-r
paramètre, comme:Remarque:
-r
- Recherchez de manière récursive les sous-répertoires.Pour effectuer une recherche dans des fichiers spécifiques, vous pouvez utiliser une syntaxe globale telle que:
Remarque: En utilisant l' option globbing (
**
), il analyse tous les fichiers de manière récursive avec une extension ou un motif spécifique. Pour activer cette syntaxe, exécutez:shopt -s globstar
. Vous pouvez également utiliser**/*.*
pour tous les fichiers (sauf les fichiers cachés et sans extension) ou tout autre motif.Si vous estimez que votre argument est trop long, envisagez de préciser votre recherche ou utilisez
find
plutôt la syntaxe suivante:Alternativement utiliser
ripgrep
.ripgrep
Si vous travaillez sur des projets plus volumineux ou de gros fichiers, utilisez
ripgrep
plutôt:Consultez la documentation, les étapes d'installation ou le code source sur la page du projet GitHub .
Il est beaucoup plus rapide que tout autre outil comme GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
ou similaire, puisqu'il est construit sur le dessus du moteur de regex de rouille qui utilise des automates finis, SIMD et optimisations littérales agressives pour faire une recherche très rapide.Il prend en charge les modèles ignorer spécifiés dans les
.gitignore
fichiers, donc un seul chemin de fichier peut être en correspondance avec plusieurs modèles de glob simultanément.Vous pouvez utiliser les paramètres communs tels que:
-i
- Recherche insensible.-I
- Ignorer les fichiers binaires.-w
- Rechercher les mots entiers (par opposition à la correspondance partielle des mots).-n
- Montre la ligne de ton match.-C
/--context
(eg-C5
) - Augmente le contexte pour que vous voyiez le code qui l'entoure.--color=auto
- Marquez le texte correspondant.-H
- Affiche le nom du fichier où se trouve le texte.-c
- Affiche le nombre de lignes correspondantes. Peut être combiné avec-H
.la source
Je le fais en utilisant xargs, une commande très sous-estimée
find ./ vous donne une liste récursive de tous les fichiers d'un dossier en cours, puis dirigez-le vers xargs qui exécute la commande grep sur chacun de ces fichiers.
la source
xargs
sans-print0
option tofind
et-0
toxargs
est obsolète, les noms de fichiers contenant des espaces échouent.Je sais qu'il y a beaucoup de réponses ici, mais voici une alternative si vous souhaitez ajouter d'autres restrictions lors de la recherche dans les fichiers:
Cela fonctionne car
grep
retournera 0 s'il a trouvé un résultat, 1 sinon. Par exemple, vous pouvez trouver des fichiers de 1 Mo et contenant quelque chose:Pour plusieurs besoins, vous souhaiterez probablement utiliser l'indicateur d'optimiseur
-O
existant dans GNU grep.la source
Un script (find-in-code) pour rechercher en C, code CPP:
Utilisation:
la source