• [^] # Re: Merci

    Posté par . En réponse au journal Des "basheries". Évalué à 6.

    Je copie colle une petite doc personnelle qui explique un peu find grep et xargs...

    find

    Trouver tous les fichiers cpp contenu dans le repertoire courant et
    tous les sous repertoires:

    find . -name '*.cpp'

    A présent on veut filtrer la liste produite par find, pour ne trouver
    que les lignes qui contiennent un mot donné. Ce mot pourra etre soit
    dans le chemin (nom d'un repertoire) soit dans le nom du fichier (on
    fait un grep sur une liste de lignes). On va utiliser grep sur la
    liste donnée par find.

    find . -name '.cpp' -print | grep agilent
    Attention, c'est case-sensitive, du coup la commande suivante ne donne
    pas tous les fichiers.
    Pour lui dire d'ignorer la casse, option -i de grep. Ca donne:
    find . -name '
    .cpp' -print | grep -i agilent

    xargs: le pouvoir

    Plus fort encore: xargs, pour faire des choses sur les fichiers
    produits par le find. Cette fois ci on ne va pas filtrer la liste que
    sort find, mais faire un grep directement dans chaque fichier trouvé.

    Voice des exemples:

    Touver tous les fichiers cpp puis faire un grep dans chacun d'eux pour
    trouver la chaine "if ( isNarrow_ )"

    $ find . -name '*.cpp' -print | xargs grep 'if ( isNarrow_ )'
    ./comp/src/algorithm/soundextract/AgileSoundInfo.cpp: if ( isNarrow_ )
    ./comp/src/algorithm/soundextract/AgileSoundInfo.cpp: if ( isNarrow_ )

    Meme chose en affichant le numéro de ligne (option -n du grep)
    $ find . -name '*.cpp' -print | xargs grep 'if ( isNarrow_ )' -n
    ./comp/src/algorithm/soundextract/AgileSoundInfo.cpp:353: if ( isNarrow_ )
    ./comp/src/algorithm/soundextract/AgileSoundInfo.cpp:457: if ( isNarrow_ )

    On peut evidement cumuler les filtres: find | grep | xargs grep. Par
    exemple:
    dans share un
    find . -name '.cpp' -print
    trouve 15664 fichier.
    find . -name '
    .cpp' -print | grep sound
    trouve 14 fichiers. Et
    find . -name '*.cpp' -print | grep sound | xargs grep 16000
    fait un grep dans ces 14 fichiers pour ne trouver qu'un seul resultat.

    l'un OU l'autre

    Maintenant voyons comment introduire le "ou" dans le find:

    Touver tous les fichiers h OU cpp, et faire un grep sur la liste
    produite afin de ne recuperer que la liste des fichier qui contiennent
    la chaine "AgileSound"
    Ici on a besoin des parentheses pour isoler l'expression car elle est
    plus complexe. Et il faut les preceder du caracteres d'echappement
    sinon le bash fait une erreur quand il voit la prenthese.
    L'option -o veut dire "or".
    find . ( -name '.cpp' -o -name '.h' ) -print | grep AgileSound

    un peu d'aide:
    http://www.gnu.org/software/findutils/manual/html_mono/find.html#Combining-Primaries-With-Operators

    grep et fichier binaire

    Parfois grep pense qu'il a affaire à un fichier binaire:

    $ grep -i DTMF MySuperSoftware.log
    Fichier binaire MySuperSoftware.log concordant
    Ce n'est pas le cas, mais il le croit. On peux s'en sortir en lui
    précisant le type de fichier auquel il a affaire, avec
    l'option --binary-files

    $ grep --binary-files=text DTMF MySuperSoftware.log
    13-10-10 09:49:11.289 [5196] DEBUG algorithm <....\src\algo\note\SndFnd.cpp:232> end DTMF found [701416,706416]
    13-10-10 09:49:12.494 [5196] DEBUG algorithm <....\src\algo\sndnote\SndFnd.cpp:162> begin DTMF found [710704,715704]