Arg list too long
hawksmoor
-
gbe54 Messages postés 87 Statut Membre -
gbe54 Messages postés 87 Statut Membre -
Salut à tous,
Voilà, sur unix(version aix) avec :
find . -name *20040623*SCR* -print -exec grep -i completed {} \;
j'ai en retour "arg list too long" .Même après redirection .de même qu'avec le xargs .Faut dire que le(s) batch(s) concernes s'enclenchent toutes les 30s(ouaf!)de 08h à 19h .
Impossible donc(pour l'instant)de visualiser ce qui se passe sous ce repertoire .Kelk'un peut-il m'aider, svp?Merci .
Voilà, sur unix(version aix) avec :
find . -name *20040623*SCR* -print -exec grep -i completed {} \;
j'ai en retour "arg list too long" .Même après redirection .de même qu'avec le xargs .Faut dire que le(s) batch(s) concernes s'enclenchent toutes les 30s(ouaf!)de 08h à 19h .
Impossible donc(pour l'instant)de visualiser ce qui se passe sous ce repertoire .Kelk'un peut-il m'aider, svp?Merci .
A voir également:
- Arg list too long
- List disk - Guide
- Pc long a demarrer - Guide
- Hiberfil.sys too big - Guide
- Directory list & print - Télécharger - Divers Utilitaires
- 3 bip long 2 bip court hp - Forum Matériel & Système
4 réponses
Il faut mettre des cotes autour de ton pattern de recherche pour pas qu'il soit interprété par le shell mais pas le find :
find . -name "*20040623*SCR*" -print -exec grep -i completed {} \;
find . -name "*20040623*SCR*" -print -exec grep -i completed {} \;
le défaut de cette commande : find . -name "*20040623*SCR*" -print -exec grep -i completed {} \;
est que un grep est exécuté pour chaque fichier.
cette commande : grep -i completed `find . -name "*20040623*SCR*" -print`
exécute un grep pour tout les fichiers trouvés
est que un grep est exécuté pour chaque fichier.
cette commande : grep -i completed `find . -name "*20040623*SCR*" -print`
exécute un grep pour tout les fichiers trouvés
La commande suggérée par dubcek pose deux problèmes et ne correspond pas à la meilleure pratique:
grep -i completed `find . -name "*20040623*SCR*" -print`
D'abord, rien ne garantit que la liste produite par find ne sera pas si grande qu'on aboutira à nouveau à un "arg list too long", d'autre part elle ne rient pas compte du fait que des directories peuvent avoir des espaces dans leur nom, ainsi un path du genre "/abc<ESPACE>/de<ESPACE>/fgh" sera interprété comme trois arguments de grep: /abc, /de et /fgh, ce qui n'aura évidemment pas de sens.
Dans le même registre, je vous laisse réfléchir aux conséquences possibles d'un script de nettoyage de /tmp du genre:
rm `find /tmp -type f -a -mtime +7`
avec un fichier "/tmp/<ESPACE>/etc/passwd" et un peu de patience...
Le même résultat est obtenu avec:
find /tmp -type f -a -mtime +7 | xargs rm <---- exemple à ne PAS imiter !
Pour éviter le problème, le mieux esr d'écrire la commande comme ceci:
find /tmp -type f -a -mtime +7 -print0 | xargs -0 -n20 rm
Qui a l'avantage d'appeler rm 20 fois moins que la version -exec tout en n'étant pas vulnérable au problème de l'espace.
Les arguments -print0 et -0 de xargs ne sont malheureusement disponibles que dans les versions GNU (Linux), à défaut, autant se tenir à la version -exec, moins performante mais plus sûre.
grep -i completed `find . -name "*20040623*SCR*" -print`
D'abord, rien ne garantit que la liste produite par find ne sera pas si grande qu'on aboutira à nouveau à un "arg list too long", d'autre part elle ne rient pas compte du fait que des directories peuvent avoir des espaces dans leur nom, ainsi un path du genre "/abc<ESPACE>/de<ESPACE>/fgh" sera interprété comme trois arguments de grep: /abc, /de et /fgh, ce qui n'aura évidemment pas de sens.
Dans le même registre, je vous laisse réfléchir aux conséquences possibles d'un script de nettoyage de /tmp du genre:
rm `find /tmp -type f -a -mtime +7`
avec un fichier "/tmp/<ESPACE>/etc/passwd" et un peu de patience...
Le même résultat est obtenu avec:
find /tmp -type f -a -mtime +7 | xargs rm <---- exemple à ne PAS imiter !
Pour éviter le problème, le mieux esr d'écrire la commande comme ceci:
find /tmp -type f -a -mtime +7 -print0 | xargs -0 -n20 rm
Qui a l'avantage d'appeler rm 20 fois moins que la version -exec tout en n'étant pas vulnérable au problème de l'espace.
Les arguments -print0 et -0 de xargs ne sont malheureusement disponibles que dans les versions GNU (Linux), à défaut, autant se tenir à la version -exec, moins performante mais plus sûre.