SVM Mac 153
Rubrique Pratique
Terminal
1 page

find, le chercheur de fichiers.
Vous avez sans doute déjà été amené à rechercher un ou plusieurs fichiers selon un ou des critères plus ou moins sophistiqués. Il existe une commande qui offre cette fonction essentielle : find.

La hiérarchie détaillée de votre dossier de départ
# find ~

Dans sa forme la plus simple, find liste récursivement l’ensemble des documents présents dans le(s) dossier(s) que vous lui donnez en paramètre(s). Ne pas s’y fier, cette commande ne fait en rien double emploi avec la commande ls équivalente car ls présente son résultat différemment, peu pratique pour une utilisation combinée avec un autre outil. 

Retrouver un fichier en connaissant tout ou partie de son nom
# find /Users -name "*.[Tt][Xx][Tt]"

L’emploi le plus courant de find reste la recherche d’un fichier à partir d’un nom ou de plusieurs fichiers à l’aide d’une expression régulière. Dans le cas présent, tous les fichiers se terminant par .txt, quelque soit la casse des trois caractères, seront trouvés dans la hiérarchie dont la racine est /Users.
Depuis Jaguar, l’option -name s’est enrichie d’une déclinaison –iname qui évite le recours à une telle gymnastique. find /Users -iname "*.txt" donnera le même résultat.

Tous les fichiers appartenant à une personne
# find / -user carole

find fournit toutes les options nécessaires à la recherche de n’importe quelle métadonnée caractérisant un fichier Unix (et spécifiquement Unix). Parmi elles, l’option –user suivie de l’identifiant Unix d’un utilisateur recensé sur votre ordinateur permet de lister tous les fichiers dont la personne est propriétaire. Ici, tous les fichiers appartenant à carole seront retrouvés.

Les fichiers sans propriétaire connu
# find /Users -nouser

Pendant de l’option –user, -nouser retrouve tous les documents privés de propriétaire, au sens Unix du terme. Typiquement, cela peut arriver après la suppression d’un utilisateur si le nettoyage de ses fichiers n’a pas été mené à bien et encore plus souvent à la suite de l’extraction des fichiers d’une archive (au format tar par exemple).

Les fichiers volumineux des utilisateurs
# find /Users -size +10000000c

Plus puissant et aussi plus complexe, les arguments requis par certaines options permettent de spécifier des intervalles et parfois même d’indiquer des unités. Quand vous voulez procéder à un nettoyage de vos disques, quoi de mieux que de retrouver les plus gros fichiers, tous ceux dont la taille (-size) excède (+) 10 millions de caractères (c) dans l’ensemble des documents de tous les utilisateurs.

Les documents plus récents qu’un fichier de référence
# find ~ -newer article_sur_find.rtf -iname "*article*find*"

Toujours plus puissant, find permet d’utiliser l’horodatage d’un fichier comme valeur de référence pour une recherche. Vérifions s’il n’existe pas dans mes dossiers personnels un document plus récent que celui sur lequel j’ai mis la main, article_sur_find.rtf, et dont le nom contient au moins les mots "article" et "find" (dans cet ordre).

Les fichiers de différents noms
# find /Library/Documentation \( -name "index.htm*" -o -name "install.htm*" \)

Contrairement à l’exemple précédent où nous définissions implicitement une conjonction, l’ensemble des options devant être vérifiées pour qu’il y ait correspondance, find permet aussi de spécifier des disjonctions. Dans ce cas, il est nécessaire de recourir à une syntaxe plus compliquée composée d’une option –o qui signifie "or" en anglais ("ou" inclusif en français, par chance la même initiale) et des parenthèses (introduites par un antislash pour que l’interpréteur de commande, le shell, les transmette littéralement à la commande find) servant à délimiter les opérandes liées à l’option -o.
Tous les documents commençant par le nom index.htm OU le nom install.htm n’importe où sous /Library/Documentation seront trouvés.

Combinaison de critères et action
# sudo find /Applications -type d \( -name "Dutch.lproj" -o -name "Japanese.lproj" -o -name "zh_*.lproj" \) -exec rm -r {} \;

Non content de retrouver des fichiers, find permet en plus d’appliquer une commande pour chaque document correspondant aux critères fournis. Chaque programme Cocoa est installé avec son lot de fichiers de langues. Les éradiquer revient à les retrouver puis à en commander la suppression. Ces éléments linguistiques sont facilement identifiables, ils sont rangés dans des dossiers (d’où l’option -type avec l’argument d comme "directory" ou "dossier") d’extension .lproj.
L’option -exec introduit l’expression à exécuter dans laquelle le symbole {} (séquence d’une accolade ouvrante suivie immédiatement d’une accolade fermante) représente le nom du fichier trouvé. Ici la commande à exécuter est rm (remove) avec son option -r (récursivement). Nous devons utiliser sudo car certains dossiers à effacer ne nous appartiennent pas.
Enfin la séquence \; doit conclure l’expression qui suit l’option -exec. 
Une variante à -exec est -ok qui réclame une confirmation systématique de la part de l’opérateur avant d’exécuter la commande qui suit l’option -ok.

Génération des occurrences pour une itération
# foreach fichier ( `find . ! -newer fichier_de_reference -prune -type f -print0` )
foreach -> mv $fichier $fichier.VIEUX
foreach -> end

Une importante limitation de l’option -exec est l’impossibilité d’utiliser plus d’une fois le symbole {} dans l’expression qui la suit. Aussi, si nous désirons par exemple renommer un lot de documents, il faudra employer un subterfuge. Ici nous élaborons une boucle dont la liste des éléments à traiter est fournie par la commande find à laquelle nous demandons de retrouver des documents plus anciens ou de même date que fichier_de_reference (-newer précédé par le signe ! qui inverse la condition), uniquement dans le dossier courant (-prune) et exclusivement de type fichier (-type f).
Chaque élément vérifiant tous ces critères est renommé à l’aide de la commande Unix mv en un fichier de même nom auquel est ajouté le suffixe .VIEUX.
L’option -print0 permet d’éviter les erreurs liées à la présence possible de caractères sensibles comme l’espace dans les noms des fichiers trouvés.

Encadré
Les caractères particuliers.
Attention Unix fait la distinction entre majuscule et minuscule, en outre certains caractères ont une fonction spécifique.
Dans les lignes ci-dessus :
#	Le dièse figure l’invite, il est l’équivalent de l’en-tête de ligne du terminal avant que vous y ayez écrit le premier caractère. Il ne fait donc pas le saisir.
\	La barre oblique inversée s’obtient en pressant la touche / tout en maintenant les touches Majuscule et Option.
[	Les crochets apparaissent lorsque vous pressez les parenthèses en maintenant les touches Majuscule et Option.
*	Un joker pour signifier ‘plusieurs caractères’.

`		METTRE ICI EXPLICATION SUR L’APOSTROPHE INVERSE UTILISEE ENCORE DANS CET ARTICLE

	Pour éviter toute confusion, le carré figure une espace.
	Ce caractère matérialise la pression sur la touche Entrée.