Forum Programmation.shell recherche mot dans fichiers ascii

Posté par  .
Étiquettes : aucune
0
15
juil.
2009
Bonjour

je souhaite rechercher le mot toto dans tous les fichiers ascii du répertoire courant et de ses sous répertoires (autant les fichiers cachés que les sous-répertoires cachés)
Je sais que la commande serait qqch comme : grep -r toto *
(et encore, je ne suis pas sûr que cela prenne en compte les objets cachés)

Néanmoins comme mes sous-répertoires contiennent des fichiers binaires très volumineux (jusque 20 GB), pour pas que la recherche prennent des jours, il faudrait pouvoir lancer ce genre de commande avec un filtre sur la taille des fichiers à scanner (p.ex. < 1Mo) et/ou sur le type (ascii/binaire)

Qqn aurait il une idée ?
Merci d'avance
  • # man grep

    Posté par  (site web personnel) . Évalué à 4.

    grep a une option pour exclure les fichiers binaires :)

    Sinon pour inclure tous les fichiers, c'est grep -R toto . (. est le répertoire courant).
    • [^] # Re: man grep

      Posté par  . Évalué à 6.

      sinon man find pour virer les gros fichiers
      du type
      find -size -1M -type f -exec grep toto '{}' \;
      (de tête, commande non testée)
  • # find -size / grep -w

    Posté par  (site web personnel) . Évalué à 3.

    En combinant:
    -grep -w
    et find -type -size
    tu devrais trouver ton bonheur

    Système - Réseau - Sécurité Open Source

    • [^] # Re: find -size / grep -w

      Posté par  . Évalué à 1.

      Voici ma version :

      find . -size -1000k -type f -print0 2>/dev/null | xargs -0 -l10 grep -wiIl toto

      explications :
      find .rechercher dans le dossier courant
      -size 1000kles items de moins de 1000ko (chez moi non plus, "-1M" ne fonctionne pas correctement)
      -type fqui sont des fichiers
      -print0afficher le résultat avec le caractère NULL comme séparateur (moins de pb avec les noms de fichiers bizarres)
      2>/dev/nullne pas afficher les erreurs (accès au fichier interdit, etc)

      xargsprendre les résultats de la commande précédente et les ajouter en arguments de la commande suivante
      -0les résultats sont séparés par le caractère NULL
      -l10(optionnel, utile si tu as énormément de fichiers) traiter 10 résultats à la fois au lieu de tous à la fois

      grep toto rechercher la chaine toto
      -wseulement si la chaîne recherchée est un mot entier (ignorera les correspondances à l'intérieur d'un mot)
      -iignorer la casse
      -Iignorer les fichiers binaires
      -lafficher le nom de fichier s'il y a correspondance, et seulement le nom de fichier

      En jouant avec ça ça fonctionne dans la plupart des situations.
      • [^] # Re: find -size / grep -w

        Posté par  . Évalué à 1.

        PS : utiliser xargs permet d'éviter de lancer un processus grep pour chaque résultat. Si on a 1000 résultats, find -exec lancera grep 1000 fois sur 1 résultat, et xargs lancera grep 1 seule fois sur 1000 résultats.
        • [^] # Re: find -size / grep -w

          Posté par  (site web personnel) . Évalué à 2.

          Noter quand même que xargs est limité par la taille maximale d'une commande shell. Ca peut être gênant si l'on a beaucoup de fichiers.

          D'où l'intérêt d'utiliser plutôt un grep récursif, si possible.
  • # Avec find et xargs

    Posté par  . Évalué à 4.

    Cherches-tu quelque chose du genre :

    find -size -1M -print0 | xargs -0 grep -I

    L'option -size de find permet de limiter la recherche aux fichiers d'une certaine taille : +1M pour limiter au fichiers de plus d'un méga, et -1M pour les fichiers de moins d'un mégaoctet.

    L'option -print0 sépare les noms des fichiers trouvés par le caractère nul, plutôt que par des retours à la ligne : c'est plus facile de gérer ainsi les noms de fichiers avec espaces. Elle va de paire avec l'option -0 de xargs, qui informe xargs que le caractère de séparation en entrée est ce 0 (sinon par défaut, c'est le retour à la ligne, comme pour find).

    Enfin, l'option -I de grep lui dit de considérer que les fichiers binaires ne contiennent jamais le motif (GNU grep a une petite heuristique pour détecter les fichiers binaires).

    Plus de précision dans les pages de manuel correspondantes ensuite. :-)
    • [^] # Re: Avec find et xargs

      Posté par  . Évalué à 1.

      super, c'est ce qui marche le mieux !!

      Qq commentaires et 1 question :

      - avec find -type f -exec grep toto {} \; , ça marche, sauf que ça ne me donne pas en mm temps le nom du fichier qui a trouvé cette occurrence

      - avec le script shell, il y a une erreur (while : Expression Syntax), mais bon, je m'y connais pas en script shell

      - mon linux (en C-shell) ne reconnait pas l'option -1M, mais ça marche avec -1000k :)

      - question: je suis pas sûr de comprendre comment marche exec dans -exec grep toto {} \;
      En fait que vaut dire exactement la partie {} \; ??

      En tous cas merci à tous
      • [^] # Re: Avec find et xargs

        Posté par  . Évalué à 2.

        bon comme dit, cest de tête, donc désolé si ça n'a pas marché

        alors pour le '{}' \; :
        le {} est remplacé par le fichier que find aura trouvé
        le ; indique la fin de la commande à éxectuter, le '\' sert à éviter l'interpretation par le shell

        donc si tu as comme fichiers:
        ./toto
        ./titi
        ./tata
        find exectutera:
        grep toto ./toto
        grep toto ./tata
        grep toto ./titi

        tu peux trouver dans le man de find des exemples plus interessants
  • # Commencer par find

    Posté par  (site web personnel) . Évalué à 1.

    La commande find permet de rechercher tous les fichiers correspondant à certains critères. On peut ainsi éliminer les fichiers vidéo ou sélectionner certains types de fichiers.

    find repertoire1 repertoire2 -P -type f -size -20M -exec grep toto {} \;

    Ou encore
    find rep1 rep2 -P -type f -size -20M -print | while read f
    do
    grep toto $f
    done

    et on peut faire plein de choses dans la boucle.

    Attention, je n'ai pas testé, man find !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.