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_ )"
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
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]
[^] # Re: Merci
Posté par fabricius . 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]