Lorsque vous démarrez avec un ordinateur, vous placerez vos fichiers dans quelques répertoires seulement. Mais lorsque le nombre de fichiers croîtra, avant de devenir complètement fou, vous créerez des sous-répertoires dans lesquels vous distribuerez vos différents fichiers. Finalement, il arrivera que vous aurez oublié où vos différents fichiers sont rangés. "Où ai-je stocké ces photos prises en Normandie ?"
Vous pourriez lancer la commande ls -R
, que nous verrons dans un chapitre ultérieur, et commencer à scruter la liste à l'écran, mais pourquoi ? Les ordinateurs sont supposés être les champions de l'automatisation. Laissons donc l'ordinateur trouver où le fichier se trouve.
Si vous savez que le fichier porte le nom "somefile", dire à l'ordinateur que faire est assez aisé.
$ find . -name somefile -print ./files/somefile
La commande find
prend plus d'arguments que les autres commandes que nous avons vues jusqu'à présent mais lorsque vous l'aurez utilisée un certain temps vous verrez que son usage devient naturel. Son premier argument (le '.') indique à find où commencer à chercher : le répertoire au sommet de l'arbre de répertoire dans lequel vous effectuez la recherche. Dans le cas présent, nous demandons à find
de commencer la recherche dans le répertoire courant.
L'argument -name
lui demande de chercher un fichier nommé somefile. Enfin, l'option -print
demande à la commande d'imprimer à l'écran l'emplacement de tout fichier qui correspond au nom donné.
Que faire si vous ne vous souvenez plus du nom du fichier que vous recherchez? Vous ne vous souvenez peut-être que du début de son nom: "some". Heureusement, find
peut également se contenter de cela.
$ find . -name 'some*' -print ./dir1/subdir2/files/somefile_other ./some_other_file ./files/somefile
Durant cette recherche, il retourne plus de fichiers que simplement celui que vous cherchez mais celui que vous cherchez se trouve dans la liste. Comme vous pouvez le voir, la commande find
sait traiter les jokers de la même manière que le shell. Vous lui avez demandé ici de rechercher tout ce qui commence par les lettres "some".
Les jokers "*", "?", and "[ ]" sont utilisés de la même manière qu'avec le shell. Cependant, comme find
utilise lui-même les jokers vous devez vous assurer qu'ils ne sont interprétés par le shell. Pour cela, vous pouvez inclure le nom du ou des fichiers que vous recherchez et les jokers qu'il contient entre apostrophes.
Équipé d'un nom et d'un emplacement, find commencera à chercher des fichiers correspondant dans tout répertoire situé sous son emplacement de départ. En fonction du nombre de sous-répertoires qui seront visités, find
pourra passer beaucoup de temps à chercher là où vous savez que le fichier ne se trouve pas.
Il est, cependant, possible de contrôler la profondeur jusqu'à laquelle find
descendra dans l'arbre des répertoires.
$ find . -maxdepth 1 -name 'some*' -print ./some_other_file
L'utilisation de l'argument -maxdepth
nous permet d'indiquer à find
de ne pas descendre plus bas que le nombre de niveaux spécifié. Une valeur de maxdepth de 1 signifie : ne pas quitter le répertoire de départ. Une valeur de maxdepth de 3 permettrait à find
de descendre 3 niveaux de répertoires plus bas que celui de départ, et ainsi de suite. Il est important de notes que -maxdepth
doit suivre immédiatement l'emplacement de départ, sinon la commande find protestera énergiquement.
La commande find
peut rechercher des fichiers en utilisant toute information que le système de fichiers possède à propos des fichiers. Par exemple, vous pouvez baser votre recherche sur les critères suivants :
ainsi que les autres critères décrits dans la page de manuel. Nous allons nous limiter ici à quelques options utilisées couramment.
L'option -mtime
permet de faire une recherche sur la date (et l'heure) de dernière modification. Supposons que vous ne vous rappeliez pas du nom d'un fichier, mais vous savez que vous l'avez créé ou modifié ces trois derniers jours. Vous pouvez rechercher dans votre répertoire personnel tous les fichiers qui ont été créés ou modifiés durant les trois derniers jours :
$ find ~ -mtime -3 -print
Notez bien le signe moins devant le 3, il signifie "moins que." Si vous êtes certain d'avoir créé le fichier hier (entre 24 et 48 heures plus tôt), vous pouvez spécifier un nombre de jours exact :
$ find ~ -mtime 1 -print
Pour rechercher les fichiers vieux de plus de 30 jours (attention: il y en aura beaucoup), il faut utiliser un plus :
$ find ~ -mtime +30 -print
Vous voulez peut-être, avant de sauvegarder un répertoire, effacer les vieux fichiers qui ont une taille importante. Il suffit de combiner -mtime
et -size
pour trouver ces fichiers. Pour être listé, un fichier doit répondre à tous les critères que vous aurez spécifiés.
$ find directory_to_backup -mtime +30 -size +500k -print
+500k est utilisé comme valeur pour l'option -size
. Le plus signifie "plus grand que" et "500k" signifie "une taille de 500 kilo-bytes".
La commande find est capable de bien plus que simple lister/imprimer des noms de fichier. Vous pouvez la combiner avec toute autre commande de manière à effacer des fichiers, les déplacer, rechercher leur contenu pour un texte particulier, et ainsi de suite. Dans ce cas, la commande find
et son option -exec
seront vos outils.
Comme l'exemple suivant les long, il a été divisé en deux lignes, la barre oblique inversée à la fin de la première ligne indique au shell qu'il doit continuer à lire la commande courante à la ligne suivante. La première ligne est la même que la commande qui permettait ci-dessus de trouver les fichiers anciens ayant une taille supérieure à 500k.
$ find directory_to_backup -mtime +30 -size +500k -print \ -exec rm {} \;
L'option -exec
est suivie de la commande rm
, qui est cependant suivie de deux choses plutôt étranges:
-exec
et qui signifie "le fichier courant trouvé"-exec
et \; comme les délimiteurs de la commande à exécuter.Ainsi chaque fichier trouvé est listé par -print
(ce qui n'est pas strictement nécessaire mais permet de voir ce qui est effacé), et effacé par l'option -exec
.
Clairement, toute erreur même minime dans une commande find peut résulter en une perte importante de donnée lorsque l'option -exec
est utilisée. Tester toujours d'abord vos commandes sur des fichiers jetables.
L'exemple suivant utilise cp
et montre comment les accolades peuvent être utilisées plusieurs fois, permettant d'utiliser aisément plusieurs copies du nom du fichier.
$ find . -name 'file*' -exec cp {} {}.backup \;
Expérimentez et exercez-vous!
Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.
Vous devriez rafraîchir la page.