Arg list too long

Fermé
hawksmoor - 24 juin 2004 à 11:43
gbe54 Messages postés 87 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 19 juillet 2010 - 19 déc. 2007 à 18:25
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 .
A voir également:

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 {} \;
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
17 avril 2007 à 09:41
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
0
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.
0
gbe54 Messages postés 87 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 19 juillet 2010 19
19 déc. 2007 à 18:25
Le problème vient effectivement des quotes autour du nom. Le find ne produira pas une liste trop longue pour grep vu qu'il va lancer un grep par fichier trouvé.
Par contre la charge peut en prendre un sacré coup.
0