[gull] Problème dans passage à Ubuntu
Marc SCHAEFER
schaefer at alphanet.ch
Wed Apr 20 09:31:02 CEST 2005
On Wed, Apr 20, 2005 at 08:22:26AM +0200, Daniel Cordey wrote:
> etendu, mais plus lent. Cette derniere commande donne les moyens de limiter
pour la lenteur de find: c'est juste, c'est dû au fait que la forme:
> find . -uid 500 -name \*.py -exec rm {} \;
va exécuter (de manière sûre) N fois une commande. exec*() sur UNIX a
beau être rapide (caches, copy-on-write, etc), si on l'exécute 100'000
fois on arrive malgré tout à des performances médiocres.
Solution intermédiaire:
xargs est une commande qui prend des données sur stdin et exécute
la commande donnée en paramètre avec à chaque fois un certain nombre
des données sur stdin passés comme arguments.
(en bref ici: il y aura N/X exécutions de rm, au lieu de N dans le
cas ci-dessus, X dépendant de la taille maximum de la ligne de
commande et de la taille des arguments, X autocalculé par xargs).
find . -uid 500 -name \*.py -print0 \
| xargs -0 rm
(on peut supprimer le -0 si l'on est sûr qu'il n'y a pas de séparateurs
dans les noms de fichiers, comme des espaces ou des sauts de ligne)
inconvénient:
- erreur si aucun fichier correspondant trouvé
work-around: xargs -0 rm -f unexistant
- difficile de détecter une erreur dans l'exécution de find
work-around: passer par un fichier temporaire ou un tube nommé
et tester les codes de retour.
> Ainsi, je peux m'assurer que je n'ai pas d'autres fichiers "oublies" dans la
> structure... Ensuite seulement, je substitue 'ls -l' par mon rm. Ceci
> s'applique a toutes les commandes shell du style rm, cp, mv, chown, etc.
Le risque de sécurité général sur un système multi-utilisateur est lié à
des modifications des données entre ces deux phases, en particulier des
métadonnées si les commandes citées travaillent sur la destination des
liens symboliques (pas le cas de GNU chown à ce que j'ai vu).
More information about the gull
mailing list