Je veux trouver tous les fichiers qui contiennent une chaîne de texte spécifique. Le grep
la 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 n'a apporté aucune aide.
Il serait préférable d'utiliser
grep -rl "string" /path
où
-
-r
(ou--recursive
l'option) est utilisée pour parcourir également tous les sous-répertoires de/path
, alors -
-l
(ou--files-with-matches
l'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é quegrep
arrêter la lecture d'un fichier à la première correspondance avec cette option).
Si vous recherchez des lignes correspondant dans des fichiers, ma commande préférée est:
grep -Hrn 'search term' path/to/files
-
-H
provoque l'impression du nom de fichier (implicite lorsque plusieurs fichiers sont recherchés) -
-r
effectue une recherche récursive -
-n
provoque l'impression du numéro de ligne
path/to/files
peut être .
pour rechercher dans l'annuaire actuel
D'autres options que je trouve très utiles:
-
-I
ignorer les fichiers binaires (complément:-a
traiter tous les fichiers comme du texte) -
-F
traitersearch term
comme un littéral, pas une expression régulière -
-i
effectuez une recherche insensible à la casse -
--color=always
pour forcer les couleurs même en passant à traversless
. Faireless
couleurs de soutien, vous devez utiliser le-r
option:grep -Hrn search . | less -r
-
--exclude-dir=dir
utile pour exclure des répertoires comme.svn
et.git
.
Je crois que tu peux utiliser quelque chose comme ça:
find /path -type f -exec grep -l "string" {} \;
Explication des commentaires
find
est une commande qui vous permet de trouver des fichiers et d'autres objets tels que des répertoires et des liens dans des sous-répertoires d'un chemin donné. Si vous ne spécifiez pas de masque que les noms de fichiers doivent respecter, il énumère tous les objets du répertoire.
-
-type f
spécifie qu'il ne doit traiter que les fichiers, pas les 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 comme argument, en remplaçant{}
avec le nom de fichier
Ma commande par défaut est
grep -Rin string *
J'utilise un " R " majuscule parce que ls
l'utilise pour récursif. Puisque grep accepte les deux, aucune raison de ne pas l'utiliser.
EDIT: par HVNSweeting, apparemment -R
suivront les liens symboliques où comme -r
ne le fera pas.
Si vous êtes prêt à essayer quelque chose de nouveau, donnez ack
coup. La commande pour rechercher récursivement le répertoire courant pour string
être:
ack string
L'installation est assez simple:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(À condition que vous ayez déjà le répertoire ~/bin
et c'est de préférence dans votre PATH
.)
La commande rgrep est dédiée à un tel besoin
S'il n'est pas disponible, vous pouvez l'obtenir comme ceci
mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep
Vous pouvez directement définir vos options grep par défaut comme décrit ci-dessus.
J'utilise personnellement
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"
sujet connexe : comment toujours utiliser rgrep avec la couleur
Mise à jour 2:
Cette ligne de commandes utilise find
et grep
résout le problème:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
pour une sortie colorée:
$ find path_to_search_in -type f \ -exec grep --color=always -in searchString {} 2>/dev/null +
Exemple:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
Un exemple exécuté dans l'instantané ci-dessous:
Mise à jour 1:
Vous pouvez essayer le code suivant; en tant que fonction dans votre .bashrc
ou .bash_aliases
ou dans un script:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done}
Utilisation: wherein /path/to/search/in/ searchkeyword
exemple:
$ wherein ~/Documents/ "hello world"
(Remarque: Comme suggéré dans les commentaires ci-dessous par @enzotib, cela ne fonctionne pas avec les fichiers/répertoires incluant des espaces dans leurs noms.)
Message original
Pour rechercher la chaîne et afficher uniquement cette ligne avec la chaîne de recherche:
$ for i in $(find /path/of/target/directory -type f); do \ grep -i "the string to look for" "$i"; done
par ex.:
$ for i in $(find /usr/share/applications -type f); \ do grep -i "web browser" "$i"; done
Pour afficher le nom du fichier contenant la chaîne de recherche:
$ for i in $(find /path/of/target/directory -type f); do \ if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
par ex.:
$ for i in $(find /usr/share/applications -type f); \ do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \ fi; done;
grep
(GNU ou BSD)
Vous pouvez utiliser grep
outil pour rechercher récursivement le dossier actuel avec -r
paramètre, comme:
grep -r "pattern" .
Note: -r
- Recherche récursive dans les sous-répertoires.
Pour rechercher dans des fichiers spécifiques, vous pouvez utiliser un syntaxe globbing notamment:
grep "class foo" **/*.c
Remarque: En utilisant option globbing (**
), il scanne tous les fichiers récursivement 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 (à l'exclusion des fichiers cachés et sans extension) ou tout autre motif.
Si vous avez l'erreur que votre argument est trop long, envisagez de restreindre votre recherche ou utilisez find
syntaxe à la place telle que:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Utilisation alternative ripgrep
.
ripgrep
Si vous travaillez sur des projets plus importants ou de gros fichiers, vous devez utiliser ripgrep
au lieu de cela, comme:
rg "pattern" .
Consultez les documents, les étapes d'installation ou le code source sur le Page du projet GitHub.
C'est beaucoup plus rapide que tout autre outil comme GNU/BSD grep
, ucg
, ag
, sift
, ack
, pt
ou similaire, car il est construit sur le dessus de Moteur regex de Rust qui utilise des automates finis, SIMD et des optimisations littérales agressives pour rendre la recherche très rapide.
Il prend en charge ignorer les modèles spécifiés dans .gitignore
fichiers, de sorte qu'un seul chemin de fichier peut être mis en correspondance avec plusieurs modèles 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 (à l'opposé de la correspondance partielle des mots). -
-n
- Montrez la ligne de votre match. -
-C
/--context
(p. ex.-C5
)- Augmente le contexte, de sorte que vous voyez le code environnant . -
--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
.
Je le fais en utilisant xargs, une commande très sous-estimée
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
trouver ./ vous donne une liste récursive de tous les fichiers d'un dossier courant, puis vous la dirigez vers xargs qui exécute la commande grep sur chacun de ces fichiers
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:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
Cela fonctionne parce que grep
retournera 0 s'il a trouvé un résultat, 1 sinon. Par exemple, vous pouvez trouver des fichiers de 1 Mo de large et contenant quelque chose:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
Pour plusieurs exigences, vous souhaitez probablement utiliser l'indicateur optimizer -O
cela existe dans GNU grep.
Caractère générique avec `include include="*.C "’ option, @user311346, merci à @Lekensteyn.
grep-RIn < yor pattern> * Recherchera à partir des répertoires actuels dans tous les fichiers texte.
Je ne sais pas comment faire ma recherche récursivement dans des modèles de fichiers comme *.C avec seulement grep
Utilisez la combinaison rechercher et grep pour rechercher récursivement des fichiers à la recherche d’une chaîne dans les répertoires courant et tous les sous-répertoires. Vérifiez ceci http://wilddiary.com/find-files-containing-my-text/