Azerty
19 déc. 2007 à 12:16
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.