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.
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.
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)
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)
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)
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 :
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 :
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.
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 :