OVH Cloud OVH Cloud

commande grep

4 réponses
Avatar
Cuba1393
salut à tous

pourquois cette commande "grep imgbas fiche* > 1.txt" ne marche pas lorsque
je la lance sur 2.000 fichiers alors qu'elle fonctionne trés bien lorsque
j'ai 10 fichiers.

Merci

4 réponses

Avatar
Sch
Cuba1393 wrote:

salut à tous

pourquois cette commande "grep imgbas fiche* > 1.txt" ne marche pas lorsque
je la lance sur 2.000 fichiers alors qu'elle fonctionne trés bien lorsque
j'ai 10 fichiers.

Merci


Salut
Trop de fichiers sont ouverts par cette commande.
essaie plutot:
find <path> -name fiche* -exec grep imgbas {} ; > 1.txt

J'ai l'impression ( à confirmer ) que le find execute séquentiellement,
alors que le grep parallelise le traitement ( du coup, trop de fichiers
sont ouverts )

Seb

Avatar
Basile Starynkevitch [news]
Le 03-03-2004, Cuba1393 a écrit :

pourquois cette commande "grep imgbas fiche* > 1.txt" ne marche pas
lorsque je la lance sur 2.000 fichiers alors qu'elle fonctionne trés
bien lorsque j'ai 10 fichiers.


Ce n'est probablement pas lié à la commande grep. Je pense que si on
remplace grep par ls ou /bin/echo on a le même problème. Il est
possible que ça passe avec echo (sans /bin/) car echo est une commande
"builtin" de votre shell.

Techniquement, j'imagine que l'appel système execve(2) a échoué (pour
en être sûr, utiliser strace sur grep). D'après le manuel, cet appel
peut échouer notamment avec l'erreur

E2BIG La liste d'arguments est trop grande.

Une solution possible pour faire marcher cette longue commande (qu'on
peut éviter avec xargs) est de modifier le fichier
/usr/src/linux/include/linux/limits.h pour y changer la ligne
#define ARG_MAX 131072 /* # bytes of args + environ for exec() */
en (par exemple)
#define ARG_MAX 1048576 /* # bytes of args + environ for exec() */

Cette modification autorisera l'appel système execve(2) à avoir des
arguments plus gros. Il s'agit de la taille maximale des arguments (du
main) poussés sur la pile par execve.

Avec l'utilisation du ** de zsh (shell que je recommande chaudement),
je trouve ce changement indispensable. Je pense qu'il faut rester
raisonnable dans la valeur de ARG_MAX (au plus [pifometriquement] 2^24
ie 16777216, et bien moins que la RAM disponible!)

Ensuite, il faut bien sûr (configurer puis) recompiler et reinstaller
votre nouveau noyau. La procédure est amplement documentée un peu
partout.

En pratique, si vous mettez à jour votre noyau (par exemple vers
2.4.25) en le compilant, profitez en pour augmenter ARG_MAX comme
ci-dessus.

Enfin, pour grep on peut souvent chercher dans un répertoire, par
exemple
grep -rn ARG_MAX /usr/src/linux/

et il y a la solution classique du xargs

J'ignore pourquoi ARG_MAX est toujours si petit en standard dans les
noyaux Linux (peut-être par compatibilité avec Posix?)

--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net
aliases: basile<at>tunes<dot>org = bstarynk<at>nerim<dot>net
8, rue de la Faïencerie, 92340 Bourg La Reine, France

Avatar
Tibi
Cuba1393 wrote:

pourquois cette commande "grep imgbas fiche* > 1.txt" ne marche pas lorsque
je la lance sur 2.000 fichiers alors qu'elle fonctionne trés bien lorsque
j'ai 10 fichiers.


Allez, je vais quand même donner la bonne réponse ;-)
C'est la ligne de commande qui est limitée en nb de caractères, quand tu
fais fiche* il étend les nom de fichier et les place sur la ligne de
commande.
La solution:
find . -name 'fiche*' | xargs grep imgbas > 1.txt

--
Tibi - (prétentieux)

Avatar
Bernard Déléchamp

[...]

commande.
La solution:
find . -name 'fiche*' | xargs grep imgbas > 1.txt


Avant, faire un rm 1.txt (ou >1.txt), et remplacer > par >> ne mangerait
pas de pain.

Faire gaffe aussi s'il y a des fichiers fiche* (ou des répertoires) plus
bas dans l'arborescence, et utiliser les options de find kivontbien.

HTH

--
L'agent de l'administration effectuera la vérification de votre propre
matériel informatique, à condition qu'il en soit capable.
Perles fiscales.