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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 )
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
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
Le 03-03-2004, Cuba1393 <planet1@freesurf.fr> 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
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
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)
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
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