Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

(gnu) grep et liens symboliques

6 réponses
Avatar
mpg
Bonjour,

j'ai une grosse arborescence dans laquelle il y a pas mal de liens
symboliques "internes" à l'arborescence. Je souhaite repérer un motif dans
des fichiers de cette arborescence avec grep -R, mais la sortie est peu
lisible à cause de la grosse redondance causée par les nombreux liens
symobliques. Il n'y a pas moyen d'éviter ça avec grep ?

J'ai bien pensé à un find . -type f -exec grep 'motif' {} \+ mais je crains
pour la longueur de la ligne de commande (environ 50 000 fichiers) et sinon
avec \; ça me paraît lamentablement peu efficace de lancer 50 000 fois
grep...

Il y a une solution plus élégante ? Je précise que c'est sur plateforme GNU
et que ça n'a pas vraiment besoin d'être protable.

Merci,
Manuel.

6 réponses

Avatar
Nicolas George
mpg wrote in message <g6ta9c$10hc$:
J'ai bien pensé à un find . -type f -exec grep 'motif' {} + mais je crains
pour la longueur de la ligne de commande (environ 50 000 fichiers)



C'est précisément le boulot de {} + de lancer juste ce qu'il faut de
commandes pour que ça se passe bien.

À noter que si c'est un Linux derrière, la limitation sur la longueur de la
ligne de commande n'existe plus depuis le 2.6.23.
Avatar
Mihamina Rakotomandimby
mpg wrote:
J'ai bien pensé à un find . -type f -exec grep 'motif' {} + mais je crains
pour la longueur de la ligne de commande (environ 50 000 fichiers) et sinon
avec ; ça me paraît lamentablement peu efficace de lancer 50 000 fois
grep...



S'il te plait, aurais-tu un lien sur la différence qu'implique ces
façons de faire? Ou alors si quelqu'un a un mot clé qui peut m'aider à
chercher et trouver...
D'après ce que tu écris, l'une des notation va lancer un grep qui va
s'occuper successivement de chaque fichier trouvé, tandis que l'autre
lancera un grep sur un fichier dès qu'il est trouvé, ce qui peut
entrainer plusieurs greps simultanés.

Je pense que vu la puissance de calcul dont on dispose de nos jours, il
ne faut pas se priver de pousser un peu le CPU.
Bon, tu n'as pas dit sur quelle machine ça allait tourner mais si, comme
presque tout le "grand public", tu as une machine à base de CPU multi
core,...

--
Huile Essentielle de Camphre http://www.huile-camphre.fr
Infogerance http://www.infogerance.us
(Serveurs, Postes de travail, Développement logiciel)
Avatar
Alain Ketterlin
Mihamina Rakotomandimby writes:

mpg wrote:
J'ai bien pensé à un find . -type f -exec grep 'motif' {} + mais je crains
pour la longueur de la ligne de commande (environ 50 000 fichiers) et si non
avec ; ça me paraît lamentablement peu efficace de lancer 50 000 fo is
grep...



S'il te plait, aurais-tu un lien sur la différence qu'implique ces
façons de faire? Ou alors si quelqu'un a un mot clé qui peut m'aider à
chercher et trouver...



Le man de find. Et aussi celui de xargs.

D'après ce que tu écris, l'une des notation va lancer un grep qui va
s'occuper successivement de chaque fichier trouvé, tandis que l'autre
lancera un grep sur un fichier dès qu'il est trouvé, ce qui peut
entrainer plusieurs greps simultanés.



Non, find va attendre que le grep se termine avant d'en lancer un
second. De toute façon, sur des greps individuels, tu n'as pas envie
que les sorties standard se mélangent.

Je pense que vu la puissance de calcul dont on dispose de nos jours,
il ne faut pas se priver de pousser un peu le CPU.



C'est pas un problème de CPU, c'est un problème de nombre de processus
à créer. Créer 50000 processus traitant chacun un fichier sera
sensiblement plus long que créer 50 processus traitant chacun 1000
fichiers. Même si dès le 2e tour l'exécutable sera dans le cache,
inutile d'exciter l'ordonnanceur pour rien.

Bon, tu n'as pas dit sur quelle machine ça allait tourner mais si,
comme presque tout le "grand public", tu as une machine à base de
CPU multi core,...



Ce n'est pas du tout sûr que tu puisses en profiter dans ce cas, sauf
bien sûr pour continuer à regarder une video pendant que ton find
s'exécute. Ou pour lancer plusieurs find de ce genre en même temps.

Si vraiment tu as deux cores libres, tu peux toujours utiliser :

find . -type f -print0 | xargs -0 grep motif

-- Alain.
Avatar
Alain Ketterlin
Je disais :

Si vraiment tu as deux cores libres, tu peux toujours utiliser :

find . -type f -print0 | xargs -0 grep motif



J'avais oublié l'option -P de xargs... Donc, lire : si tu as vraiment
(n+1) cores libres :

find . -type f -print0 | xargs -0 -P $n grep motif

(pas forcément utile ou souhaitable dans le cas de grep sans -l).

-- Alain.
Avatar
mpg
Le (on) jeudi 31 juillet 2008 23:56, Nicolas George a écrit (wrote) :

mpg wrote in message <g6ta9c$10hc$:
J'ai bien pensé à un find . -type f -exec grep 'motif' {} + mais je
crains pour la longueur de la ligne de commande (environ 50 000 fichiers)



C'est précisément le boulot de {} + de lancer juste ce qu'il faut de
commandes pour que ça se passe bien.



Ah, super très bonne nouvelle.

À noter que si c'est un Linux derrière, la limitation sur la longueur de
la ligne de commande n'existe plus depuis le 2.6.23.



Bonne nouvelle aussi.

Merci !

Manuel.
Avatar
Mihamina Rakotomandimby (R12y)
Alain Ketterlin wrote:
l'option -P de xargs... Donc, lire : si tu as vraiment
(n+1) cores libres :

find . -type f -print0 | xargs -0 -P $n grep motif

(pas forcément utile ou souhaitable dans le cas de grep sans -l).



Merci pour l'explication.