Je souhaite rechercher tous les fichiers contenant une chaîne de texte spécifique. le grep
commande fonctionne, mais je ne sais pas comment l'utiliser pour chaque répertoire (je ne peux le faire que pour mon répertoire actuel). J'ai essayé de lire man grep
, mais cela n'a donné aucune aide.
Il serait préférable d'utiliser
grep -rl "string" /path
où
-r
(ou --recursive
) option permet de parcourir également tous les sous-répertoires de /path
, tandis que
-l
(ou --files-with-matches
) est utilisée pour imprimer uniquement les noms de fichiers correspondants, et non les lignes correspondantes (cela pourrait également améliorer la vitesse, étant donné que grep
arrêtez de lire un fichier au premier contact avec cette option).
Si vous recherchez des lignes correspondant à des fichiers, ma commande préférée est la suivante:
grep -Hrn 'search term' path/to/files
-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 ligne
path/to/files
peut être .
rechercher dans le répertoire courant
D'autres options que je trouve très utiles:
-I
ignore les fichiers binaires (complément: -a
traiter tous les fichiers comme du texte)
-F
traiter search term
en tant que littéral, pas une expression régulière
-i
faire une recherche insensible à la casse
--color=always
pour forcer les couleurs même lors du passage less
. Faire less
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 vous pouvez utiliser quelque chose comme ceci:
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 un masque que les noms de fichiers doivent rencontrer, il énumère tous les objets de répertoire.
-type f
spécifie qu'il ne doit 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 argument, en remplaçant {}
avec le nom de fichier
Ma commande par défaut est
grep -Rin string *
J'utilise un capitole «R» 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
suivra les liens symboliques où -r
ne sera pas.
Si vous voulez essayer quelque chose de nouveau, donnez ack
un coup de feu. La commande de recherche récursive dans le répertoire en cours pour string
est:
ack string
L'installation est assez simple:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(Pourvu 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 à ce besoin
Si non disponible, vous pouvez l'obtenir comme ça
mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
Vous pouvez directement définir vos options de grep par défaut comme décrit ci-dessus.
Je 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 utilisant find
et grep
corrige le problème:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
pour 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
}
Usage: 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, y compris les espaces dans leurs noms.)
Poste d'origine
Pour rechercher la chaîne et sortir 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 exemple.:
$ 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 exemple.:
$ for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;