IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Recherche d'un mot dans un répertoire


Sujet :

Linux

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut Recherche d'un mot dans un répertoire
    salut à tous,

    je viens encore casser les pieds avec mes questions sur le shell

    Bon, je voudrais retrouver un mot dans tous les fichiers contenus dans un répertoire et ses sous-répertoires. Voilà ce que j'ai déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find -name *.c -exec cat {} \; | grep [Uu]pload
    Ce code est bien mais il ne m'affiche pas le nom des fichiers qui contiennent au minimum une occurence de "upload". J'ai donc pensé à passer le résultat de find dans une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find -name *.c -exec youpi={} \; | cat $youpi | grep [Uu]pload
    Et là il me balance tous les fichiers existants sans lister leur contenu avec l'erreur "No such file or directory"
    Et en rajoutant un $ devant {} j'ai un bad substitution.

    Un p'tit coup d'main serait le bienvenu

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Ceci, peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.c" -exec grep -l [Uu]pload {} \;
    Bonne continuation

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Merci pour la solution mais je me suis mal exprimé encore une fois. Je voudrais afficher non seulement le nom du fichier mais aussi la ligne qu'il trouve, ça me permettra de voir tout de suite si ma recherche est bien ciblée ou non...

    A mon avis que je dois faire un script à ce niveau et ce qui me bloque c'est comment faire pour créer la liste de fichiers pour qu'il travaille avec un seul fichier à la fois. En gros c'est la condition sur la boucle for ou while qui me bloque et comment récupérer le nom du fichier pour faire après des traitements dessus.

    Merci de ton aide

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut Re: [shell] recherche d'un mot dans un répertoire
    b]man grep[/b] me dit que l'option -r peut t'etre utile...

  5. #5
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut Re: [shell] recherche d'un mot dans un répertoire
    Citation Envoyé par alveric
    man grep me dit que l'option -r peut t'etre utile...
    -H aussi qui affiche le fichier parcouru

  6. #6
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par le mage tophinus
    Merci pour la solution mais je me suis mal exprimé encore une fois. Je voudrais afficher non seulement le nom du fichier mais aussi la ligne qu'il trouve, ça me permettra de voir tout de suite si ma recherche est bien ciblée ou non...
    Pour ça, j'ai la solution du bourrin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.c" -print -exec grep [Uu]pload {} \;
    On sort tous les noms de fichier, et on sort les matches éventuels ...

    Autre solution de bourrin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.c" -exec grep -l [Uu]pload {} \; -exec grep [Uu]pload {} \;
    On sort les noms des fichiers qui matchent et aussi le match ...


    Citation Envoyé par le mage tophinus
    A mon avis que je dois faire un script à ce niveau et ce qui me bloque c'est comment faire pour créer la liste de fichiers pour qu'il travaille avec un seul fichier à la fois. En gros c'est la condition sur la boucle for ou while qui me bloque et comment récupérer le nom du fichier pour faire après des traitements dessus.
    Là ... je ne suis plus très bien ... Tu veux avoir une liste des fichiers pour les traiter en bloc (ce que fait find ... -print), ou bien tu veux passer dessus un par un (ce que fait find ... -exec) ?

    Le nom de fichier, il est dans la sortie du -print (mais tu ne sais pas à ce moment si son contenu te convient), ou bien dans le {} du -exec (et avec la recherche, tu sais tout de suite s'il est bon. Choisis où tu veux l'utiliser ...

    Si tu veux vraiment sortir les boucles, tu as ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in `find . -name "*.c" -exec grep -l [Uu]pload {} \;` ; do echo $i ; grep [Uu]pload $i ; done
    Mais c'est à mon avis superflu et pas plus efficace que la deuxième solution de bourrin donnée plus haut.

    L'option -r de grep est une réelle bénédiction pour ce genre de traitement, malheureusement elle n'est pas disponible dans toutes les versions (elle n'est pas dans le grep GNU 2.5 par exemple) ... il ne faut donc pas tout miser dessus

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Merci 2Eurocents. Effectivement c'est la deuxième solution que je cherchais, je ne savais pas qu'on pouvait coller deux -exec l'un à la suite de l'autre; vraiment très puissant ce find.

    La première solution j'avais déjà essayé et je l'avais arrêté tout de suite parce que 300Mo avec plein de petits fichiers c'est très lourd à scanner et surtout à voir au bon moment la ligne qui contient la ligne que je recherche.

    Sinon j'avais bien essayé -H mais j'arrivais pas à avoir ce que je voulais, c'est pour ça qu'à la fin, je pensais qu'il n'y avait qu'un script shell avec une boucle for pour m'en sortir.

    Encore merci pour tout à tous

  8. #8
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Une précision, tout de même, c'est que find est déjà lourd en appels systèmes bloquants sur les noyaux 2.4, et que là, pour chaque fichier, on fait 2 greps ... Ca fait de la charge système, tout ça !

    Il y a certainement moyen de faire plus propre ! ( je veux dire : c'est une certitude ... mais j'ai pas trop le temps de chercher )

    Bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche d'un mot dans fichiers JAVA
    Par arsenik7 dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2006, 11h25
  2. Recherche d'un mot dans une structure
    Par Remedy dans le forum C
    Réponses: 28
    Dernier message: 25/05/2006, 23h37
  3. Recherche d'un mot dans une phrase se touvant dans un champ
    Par Grandbastien dans le forum Access
    Réponses: 3
    Dernier message: 02/04/2006, 09h58
  4. Réponses: 4
    Dernier message: 01/03/2006, 13h58
  5. Recherche d'un mot dans une page
    Par Emcd dans le forum Langage
    Réponses: 4
    Dernier message: 12/01/2006, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo