Sites


Introduction à la ligne de commande

CommandLineIntro: Searching

Rechercher des fichiers   

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é.

Find et les jokers

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.

Limiter la recherche

É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.

Utiliser des critères

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 :

  • Quand les fichiers ont été modifiés ou accédés 
  • Leur taille
  • Qui en est propriétaire, ou à quel groupe ils appartiennent
  • Quelles permissions (lire, écrire, exécuter) leur sont attachées
  • Leur type (répertoire, fichier normal)

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".

Utiliser find pour exécuter une commande sur plusieurs fichiers

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:

  • {} est une chaîne spécifique à l'option -exec et qui signifie "le fichier courant trouvé"
  • \; est nécessaire pour indiquer à find la fin de la commande à exécuter sur chaque fichier trouvé. Cette commande peut avoir autant d'arguments que nécessaire. Vous pouvez voir -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.