[gull] Petite question grep
Félix Hauri
felix at f-hauri.ch
Wed Nov 18 16:34:57 CET 2009
On Wed, Nov 18, 2009 at 03:33:52PM +0100, Nicolas Borboën wrote:
>> Or, si j'ai bien compris le probleme, on veut avoir la liste des
>> fichiers qui contiennet expr1 & expr2, mais pas forcement sur *la meme
>> ligne*. Juste ?
>>
> Juste!
>> Si c'est le cas, je propose une ecriture marrante, mais qui implique
>> que les noms de fichiers ne contienent pas d'espaces (sinon il fauit
>> utiliser xargs). je dis bien... c'est juste interessant... :-)
>>
>> grep "expr2" $(grep -rilw "expr1" * 2>/dev/null | sed 's/:.*$//' | sort -u)
Oui, mais c'est juste ``marrant''.
La manière la plus ``juste'' proposée jusqu'ici est celle de Marc Mongenet.
On pourrait pousser encore pour assurer les noms de fichier farfellus
et dans la recherche de l'excellence:
Plutot que l'option -r, utiliser la commande find qui permet d'être précis
dans la récursion, comme dans les noms de fichiers:
$ find . -type f -exec grep -iwq "expr1" {} \; -print0 | xargs -0 grep -iwl "expr2"
Pour la recursion voir ``-maxdepth'' et ``-mindepth'' dans ``man find''.
L'avantage de print0 est que les noms de fichiers sont séparés par \\000 (chr(0))
plutôt que des sauts-de-ligne...
$ find . -type f -exec grep -iwq "expr1" {} \; -exec grep -iwq "expr2" {} \; -print0 | tar -c -T - --null -z -f tarball.tgz
( ou
.... | xargs -0 rm
pour effacer d'un coup tous les fichiers qui correspondent...)
Le caractère ``zero'' est égallement utilisé par ``tar'', ``xargs'', etc.
(RTFM! ;)
--
Félix Hauri - <felix at f-hauri.ch> - http://www.f-hauri.ch
More information about the gull
mailing list