[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