mercredi 8 octobre 2008

"find -exec" VS "xargs"

Question recurrente, réponse "simple".
D'abord mes sources (plus simple à lire que le "man", enfin pour commencer bien sûr) :
- http://www.sunmanagers.org/pipermail/summaries/2005-March/006255.html
- http://content.hccfl.edu/pollock/Unix/FindCmd.htm

Par exemple, pour supprimer des fichiers, pouvant comporter des caractères bizarroïdes, datant de plus de x jours et cela dans un répertoire donné, la commande "magique" est :
REP_FIC=/path/to/file
KEEPDAYS=1

# recherche
# dans REP_FIC
# -ctime : status modifié depuis + de KEEPDAYS jours (n*24h)
# -daystart : référence = début de la journée plutôt que heure d'exécution
# -type : "f" = fichier régulier
# -print0 xargs -0 : pour eviter les NULL dans find et xargs
# -r : afin d'éviter l'exécution de la commande si la stdin est vide, sinon c'est exécuté 1 fois sur le rép courant.
# -n : éventuellement le rajouter afin de limiter à le nombre d'argument passer dans une ligne de commande (mais le temps d'exécution sera plus long). Pratique si l'on veut faire un "ln -s" plutôt qu'un "rm"
/usr/bin/find $REP_FIC -daystart -ctime +$KEEPDAYS -type f -print0 | xargs -0 -r rm -f

Il existerai une autre alternative (que je n'ai pas validée) : find ... -exec command {} +

Aucun commentaire: