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
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
A voir également:
- Arg list too long
- Pc long a demarrer - Guide
- List disk - Guide
- Hiberfil.sys too big - Guide
- Directory list & print - Télécharger - Divers Utilitaires
- Traduction anglais français texte long gratuit photo - Guide
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 {} \;
dubcek
Messages postés
18753
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
7 novembre 2024
5 619
17 avril 2007 à 09:41
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
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.
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
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.
Par contre la charge peut en prendre un sacré coup.