61 votes

Bash : existe-t-il un moyen de rechercher une chaîne particulière dans un répertoire de fichiers ?

Duplicata possible :
Recherche d'un modèle de texte sous linux

Dans bash, je me demandais s'il existait des commandes qui vous permettraient de savoir si une chaîne de caractères particulière que vous recherchez existe dans les fichiers situés dans le répertoire actuel dans lequel vous vous trouvez.

Supposons que vous cherchiez la fonction "toUpperCase()" dans un ensemble de fichiers C dans votre répertoire actuel. Il y a beaucoup de fichiers, donc vous ne voudriez pas ouvrir manuellement chacun d'entre eux en utilisant vim et vérifier la chaîne 'toUpperCase' car cela prendrait beaucoup de temps. Si ce n'est pas une ligne de commande bash, existe-t-il une autre méthode pour faire cela efficacement ?

1voto

dietbuddha Points 138

find y grep

find myproject -name '*.c' -exec grep 'toUpperCase(' {} \; -print

pourquoi pas seulement grep ?

grep -r string . va parcourir tous les fichiers du répertoire courant. Si vous avez des fichiers objets ou d'autres binaires, vous pouvez obtenir une correspondance avec des résultats binaires, c'est-à-dire des déchets. Si vous avez aussi des fifos ou des fichiers de périphérique dans votre sous-répertoire, vous pouvez avoir des conséquences inconnues ou involontaires.

grep string *.c ne recherche que dans les répertoires courants .c des fichiers.

grep string **/*.c permet de rechercher tous les sous-répertoires. Toutefois, si vous avez un nombre très important de .c vous courez le risque de dépasser le nombre maximum d'expansions pour le glob Shell. L'expansion doit également se produire en premier, ce qui signifie une traversée complète de l'arbre avant que l'extension ne soit effectuée. grep commence.

0voto

Łukasz W. Points 117

Grep fera l'affaire mais un peu de script supplémentaire permettra de trouver le nom du fichier et la ligne exacte référencée. Si c'est ce que vous voulez, je trouve que ce qui suit fonctionne bien. Je l'ai enregistré comme un Shell Shell et je lui passe la valeur que je veux comme première option de ligne de commande.

for i in $(ls)
do
    cat $i 2> /dev/null | grep $1 > /dev/null 2>&1
    STATUS=$?
    if [ $STATUS  -eq 0 ] ; then
        echo $i
        cat $i | grep -n $1
    fi
done

0voto

Jiri Kovalsky Points 21

Je trouve intéressant que personne n'ait répondu à votre question spécifique : "comment puis-je savoir si une chaîne de caractères particulière existe dans les fichiers situés dans le répertoire actuel". Pour autant que je sache, il n'existe pas d'option grep qui renvoie uniquement si une correspondance a été trouvée dans un groupe de fichiers. L'option la plus proche est -l pour lister le(s) nom(s) de fichier. La réponse la plus proche parmi celles proposées jusqu'à présent est celle de Tim, avec quelques légères modifications :

#!/usr/bin/bash

for i in $(ls *.c 2> /dev/null)
do
    cat $i 2> /dev/null | grep $1 > /dev/null 2>&1
    STATUS=$?

    if [ $STATUS  -eq 0 ] ; then
        echo "Found"
        exit
    fi
done

echo "Not found"

Vous pourriez rendre ce Shell Shell plus générique en acceptant un second argument pour l'extension du fichier sans trop de problème.

doug

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X