samedi 28 juillet 2012

Find

Find cherche dans l'arborescence débutant à chaque nom de fichier donné en évaluant l'expression de gauche à droite, suivant les règles de la précédence. Il peut appliquer sur chaque fichier des commandes internes (affichage, suppression, etc) ou externes.

Cet article concerne la version 4.4.2 de Find.

Choisir entre find et for ... in

Lorsqu'on a besoin d'effectuer des opération sur des fichiers, il y a deux options majeures. La commande find, et la boucle for ... in. La magie de Linux c'est qu'il y a toujours plein de façon de faire une même chose, mais ce sont les deux plus courantes.

Quand on ne cherche qu'a itérer sur des fichiers de façon non-récursive et sans préoccupation de leur stats (taille, date, droits, etc). Mieux vaut utiliser une boucle for ... in. En effet, un for ... in va lister (une seule fois) tous les fichiers du dossier courant correspondant au pattern (Ex: *.txt), et ne va évaluer ce pattern qu'une seule fois, au lancement.

Find trouve toute sa puissance dès qu'il s'agit d'être récursif ou de mettre en place une sélection avancée (voir exemple suivant). Mais il faut prendre en compte sa dimension "temps réel". J'entends par là que si vous modifiez des fichiers dans un find qui sont toujours susceptibles de correspondre au pattern, ils seront retraités par find, au risque de boucler éternellement.

Appliquer des droits sur des fichiers

J'ai un serveur multimedia (Mediatomb) sous Linux (Ubuntu 12.04 Server). Comme il est assez gros (2 To), j'utilise plusieurs disques externes, multimedia ou non, pour le sauvegarder (Un Archos 500 Go pour la musique, les vidéos musicales et les photos; Un disque USB de 500 Go pour un double des photos et les documents; Un disque USB de 1 To pour les vidéos non-musicales). Par conception ou destination, ces disques ont besoin que les fichiers appartiennent à root:root et soient accessibles en lecture/écriture.

Avant chaque sauvegarde, je dois vérifier que les droits sont d'applomb. J'utilise le petit bout de script suivant que j'applique à chaque dossier à sauvegarder avec en plus de la gestion d'erreur, et du repporting écran que j'ai retiré pour l'exemple.

find /share ! -user root -exec chown root {} \;
find /share ! -group root -exec chgrp root {} \;
find /share -type d ! -perm 0777 -exec chmod 0777 {} \;
find /share -type f ! -perm 0666 -exec chmod 0666 {} \;

Grâce à find, je change le propriétaire des fichiers qui ne sont pas à root pour root. Ensuite je fais la même chose pour le groupe. Tous mes dossiers doivent être en mode 0777, et mes fichiers en mode 0666. Donc j'applique ces droits sélectivement; uniquement sur les entrées qui sont dans un autre mode.

La première version de ce script était en mode bourrin. Un enchaînement de chown, chgrp et chmod avec l'option --recursive ... L'opération prenait dix fois plus de temps. Façon de parler, il me semble que c'était bien plus de dix fois. Une opération qui prenait plus d'une demi-heure peu importe le nombre de fichier à réparer, prend aujourd'hui moins d'une minute et s'allonge très légèrement en fonction du nombre de fichier à traiter. Sans compter le niveau de stress que cela imputait sur les disques.

Voir aussi la manpage de find version 4.4.2 (à venir)

Retourner à Bash

Aucun commentaire:

Enregistrer un commentaire