Vous êtes sur la page 1sur 6

Les commandes Unix/Linux

Didier SIMON Copyright Didier SIMON 2007 TABLE DES MATIERES


1 Rechercher des fichiers avec find 1.1 Recherche simple 1.2 Les mta-caractres 1.3 La ngation 1.4 Majuscules/Minuscules 1.5 Autres critres de recherche 1.5.1 Recherche par le type 1.5.2 Recherche par le propritaire ou le groupe 1.5.3 Le temps 1.6 Recherche multi-critres 1.7 Profondeur de la recherche 1.8 Affichage des rsultats 1.8.1 L'affichage simple 1.8.2 L'affichage dtaill 1.8.3 L'affichage format 1.9 Que faire de tous ces rsultats

INTRODUCTION
Si les interfaces graphiques prsentent un confort indniable, il existe beaucoup de situations o la ligne de commande se montre bien plus efficace et il y a mme des choses que l'on ne pourrait imaginer faire avec des clics de souris. Avec ce tutoriel (d'autres suivront), j'espre vous dmontrer cela en vous donnant des exemples concrets en commenant par les besoins les plus lmentaires pour aller jusqu' des cas beaucoup plus complexes. Dans les tutoriels, nous faisons rfrence aussi bien aux Unices qu' Linux et autres systmes de type Unix tels que FreeBSD, NetBSD et OpenBSD.

1 Rechercher des fichiers avec find


La commande find permet de chercher des fichiers ou des rpertoires dans une arborescence de rpertoires. C'est une commande particulirement puissante permettant non seulement d'effectuer des recherches de faon extrmement prcise, mais galement de lancer des traitements sur les fichiers ou rpertoires trouvs.

1.1 Recherche simple


Ce premier exemple trs simple vous montre comment rechercher un fichier du nom de photo.jpg :
fn -aepoojg id nm ht.p .iae/ht.p /mgspoojg .iae/aacspoojg /mgsvcne/ht.p

Le rsultat nous montre que la recherche t faite partir du rpertoire courant. C'est le comportement par

dfaut de find, mais il est possible de prciser un chemin relatif ou absolu, partir duquel doit s'effectuer cette recherche :
fn /-aepoojg id nm ht.p

(La recherche se fera partir de la racine.)

1.2 Les mta-caractres


Nous pouvons utiliser des mta-caractres dans le motif pour remplacer un ou plusieurs caractres lorsque l'on ne connait pas le nom complet. les mta-caractres peuvent tre ? pour remplacer 1 caractre, ou * pour remplacer 0 n caractres. Modifions notre commande comme ceci :
fn .-ae"ht?jg id nm poo.p" .iae/ht1jg /mgspoo.p .iae/ht2jg /mgspoo.p .iae/aacspoo.p /mgsvcne/htAjg .iae/aacspoo.p /mgsvcne/htBjg

Chaque caractre ? remplace exactement un caractre et nous n'avons donc plus parmis les rsultats, les fichiers photo.jpg. puisqu'ils ne comportent aucun caractre entre photo et le point. Attention ! Remarquez dans la commande, les guillemets qui entourent le motif. Ils sont l pour tre sr que le motif soit bien transmis tel quel la commande find car nous voulons que ce soit elle qui l'interprte et non le shell qui utilise galement les mta-caractres. Une autre mthode consiste faire prcder chaque mtacaractre par un antislash.
fn .-aepoo?jg id nm ht\.p

Si nous n'avions pas utilis de guillemets ni d'antislash, le shell aurait intercept le mta-caractre et aurait cherch tablir la correspondance avec d'ventuels fichiers ou rpertoires se trouvant dans le rpertoire courant avant d'excuter la commande. S'il s'y trouvait par exemple un fichier du nom de photoA.jpg, alors le shell remplacerait sans nous en informer, le motif par le nom du fichier trouv et la commande rellement excute deviendrait :
fn .-aepoo.p id nm htAjg

Ce n'est bien sr pas ce que nous voulons. Si le shell trouve plus d'un fichier correspondant ce motif, il remplacera le motif par tous les noms de fichiers qu'il a trouvs et la commande ressemblerait alors a :
fn .-aepoo.p poo.p poo.p id nm htAjg htBjg htCjg

La syntaxe de cette dernire commande est incorrecte et son excution nous renverrait alors un message d'erreur. Il est cependant possible d'utiliser plusieurs motifs ou critres de recherche, et nous verrons plus loin comment faire. L'oubli des guillemets est une erreur assez sournoise car comme nous l'avons vu, selon le cas, nous n'obtenons pas toujours de message d'erreur. De plus, si le shell ne trouve aucun fichier correspondant, le mta-caractre ne sera pas interprt par lui et la commande s'excutera comme nous l'avions prvu. On peut donc rpter l'erreur de nombreuses fois sans mme s'en rendre compte. S'il faut remplacer un nombre indtermin de caractres, alors nous utiliserons le caractre * comme dans ce nouvel exemple :
fn .-ae"ht*jg id nm poo.p" .iae/ht.p /mgspoojg .iae/ht1jg /mgspoo.p .iae/ht2jg /mgspoo.p

.iae/ht7.p /mgspoo5jg .iae/aacspoojg /mgsvcne/ht.p .iae/aacspoo.p /mgsvcne/htAjg .iae/aacspoo.p /mgsvcne/htBjg .iae/aacspooniesiejg /mgsvcne/htAnvrar.p

1.3 La ngation
Il peut arriver que nous voulions exclure certains fichiers du rsultat d'une recherche. find utilise pour cela le caractre ! (point d'exclamation) en signe de ngation que l'on place devant l'expression inverser. Dans notre prochain exemple, en faisant prcder -name du caractre de ngation, nous obtiendrons tous les fichiers et rpertoires ne contenant pas dans leur nom la chane "photo" :
fn .!-ae"poo" id nm *ht*

1.4 Majuscules/Minuscules
Par dfaut, find est sensible la casse, c'est dire qu'il diffrencie les majuscules et les minuscules. Une recherche de "photo.jpg" ne permettra pas de trouver le fichier "Photo.jpg". Pour rendre find insensible la casse, il faut utiliser le paramtre -iname la place de -name.
fn .-nm "ht.p" id iae poojg

trouvera aussi bien Photo.JPG que photo.jpg.

1.5 Autres critres de recherche


Le nom ne suffit pas toujours trouver notre bonheur. Nous prfrerions parfois trouver certains types de fichiers, ceux appartenant un utilisateur ou encore ceux qui ont t modifis depuis un certain temps. find vous offre une multitude de paramtres afin de raliser toutes sortes de recherches.

1.5.1 Recherche par le type


Recherche de fichiers :
fn -yef id tp

Recherche de rpertoires :
fn -yed id tp

Recherche de liens symboliques :


fn -yel id tp

1.5.2 Recherche par le propritaire ou le groupe


fn -srmce id ue ihl fn -ru cmt id gop opa

1.5.3 Le temps
Il est quelques fois intressant de savoir quels fichiers ont t modifis ou auxquels on a accd depuis un certain laps de temps. Il est galement important et particulirement pour un l'administrateur d'un systme, de vrifier si les droits d'accs de fichiers ou de rpertoires ont t changs. Il existe plusieurs paramtres pour cela, composs d'un prfixe qui dtermine le type d'information que l'on veut vrifier, et d'un sufixe qui prcise l'interval de temps.

Les prfixes sont a pour accs, m pour modification et c pour status et les suffixes sont time pour une tranche de 24 heures et min pour les minutes. La valeur numrique donne peut tre prcde des signes + ou - s'il faut prendre en compte l'interval se situant avant ou aprs l'information de temps. les fichiers ayant t mofifis il y a moins de 30 minutes :
fn -yef-n -mn-0 id tp ad mi 3

Les rpertoires auxquels on n'a pas accd depuis plus de 72 heures :


fn -yed-n -tm + id tp ad aie 3

Les entres du rpertoire /etc et de ses sous rpertoires qui ont vu leurs droits d'accs modifis ces dernires 24 heures :
fn /t -tm id ec cie 1

La valeur donne aux paramtres xtime indique un nombre de jours, mais il s'agit de n jours la mme heure. Or nous voulons gnralement avoir des informations sur les n dernires journes compltes. find autorise cela grace au paramtre -daystart. En modifiant ainsi notre dernier exemple, nous obtenons les mmes informations mais sur toute la journe d'hier.
fn /t -asat-tm id ec dytr cie 1

Il est possible d'omettre le signe, et le temps est alors donn pour exact mais cela n'a gnralement pas beaucoup d'utilit.

1.6 Recherche multi-critres


Nous avons voqu plus haut la possibilit de faire des recherches multi-critres. Nous pouvons en effet combiner les effets des diffrents critres disponibles en les associant l'aide d'oprateurs logiques tels que -and (ET) ou -or (OU). Il est ainsi possible de cumuler plusieurs critres comme le montre l'exemple suivant. Les fichiers contenant la chane photo ou picture, sans diffrencier les minuscules et les majuscules, rpertoires exclus et ayant t modifis il y a moins de 30 minutes :
fn .\ -nm "poo"-r-ae"pcue"\ -n !-yed-n -mn-0 id ( iae *ht* o nm *itr* ) ad tp ad mi 3

Les parenthses sont ncessaires lorsque l'on veut rendre une expression prioritaire. Pour la mme raison que pour les mtacaractres, nous devons empcher que ces dernires soient interprte par le shell et pour cela nous utilisons ici le caractre \ (backslash). Il existe un ordre de priorit des oprateurs qui peut nous viter d'avoir recours aux parenthses. par exemple, l'oprateur -or est prioritaire par rapport -and ce qui fait que dans notre exemple, les parenthses n'taient pas indispensables. Toutes fois, il est intressant de les utiliser malgr tout pour des raisons de lisibilit et pour viter des erreurs lorsque la combinaison des expressions devient relativement complexe.

1.7 Profondeur de la recherche


Nous l'avons vu, find effectue ses recherches de faon rcursive. Quelques fois, il est inutile d'aller trs loin dans l'arborescence. Nous avons alors la possibilit de prciser le niveau de rcursivit de la recherche que nous voulons effectuer grce au paramtre -maxdepth. Une valeur de 1 permet de s'arrter au seul rpertoire indiqu comme point de dpart ou bien uniquement le rpertoire courant par dfaut. Cela nous permettrait par exemple d'obtenir la liste des rpertoires d'utilisateurs ayant ou ayant eu un compte sur ce poste.
fn /oe-adph1-yed id hm mxet tp

A l'inverse, le paramtre -mindepth nous permet de ne faire des recherches que dans les sous-rpertoires les plus profonds. Si vous connaissez une application utile ce paramtre, je vous invite m'en faire part.

1.8 Affichage des rsultats


Vous avez pu entrevoir la prcision avec laquelle nous pouvons indiquer find ce que nous recherchons. Vous allez voir que nous pouvons avec la mme prcision affecter la manire dont il doit afficher les rsultats de ces recherches. Dans les exemples que vous avez pu voir jusqu'ici, chaque fichier ou rpertoire trouv tait affich avec son chemin relatif au rpertoire de dpart. C'est ainsi que find prsente le rsultat de ses recherches en l'absence d'indications.

1.8.1 L'affichage simple


Le premier des paramtres ddis l'affichage est -print. il ne prend aucun argument et c'est le paramtre par dfaut. Son utilisation seule donnera le mme rsultat que si nous l'omtons, mais Nous verrons plus loin qu'il est parfois ncessaire de l'utiliser.

1.8.2 L'affichage dtaill


Une deuxime manire d'afficher le rsultat est l'affichage dtaill la faon ls -l avec le paramtre -ls. Nous ne nous tendrons pas sur ce paramtre.

1.8.3 L'affichage format


Un paramtre particulirement intressant est le paramtre -printf. Les programmeurs C l'auront devin, il permet d'effectuer une sortie formate du rsultat grace une chane de formatage (Attention cependant, car si la syntaxe est assez proche, les caractres indiquant les lments afficher sont quant eux diffrents). Grace ce paramtre, il est possible d'afficher n'importe quelles informations concernant les fichier ou les rpertoires. Par exemple, la date et l'heure de leur dernier accs :
fn .-rnf"h% :driracsl %A%d%B%Y%H%M%Sn id pit %/f ene c e A A A A A:A:A\" .. . .GUtpDfut/idwae :driracsl mrrd 2 ji 20 1:02 /Nse/ealsWnoMkr ene c e ecei 8 un 04 95:0 .GUtpDfut/Moteu:driracsl mrrd 2 ji 20 1:02 /Nse/ealsWRoMn ene c e ecei 8 un 04 95:0 .GUtpDfut/Mtt :driracsl mrrd 2 ji 20 1:02 /Nse/ealsWSae ene c e ecei 8 un 04 95:0 .GUtpDfut/Mtt~:driracsl mrrd 2 ji 20 1:02 /Nse/ealsWSae ene c e ecei 8 un 04 95:0 .GUtpDfut/Midwtrbts:driracsl mrrd 2 ji 20 1:02 /Nse/ealsWWnoAtiue ene c e ecei 8 un 04 95:0 .. .

Observons la ligne de commande et le rsultat ci-dessus. La chane entre guillemets est la chane de format. On y voit du texte, qui sera affich tel quel, des variables (commenant par le caractre \%) et un caractre spcial \n (le backslash tant le caractre d'chappement pour insrer les caractres spciaux). La variable \%h reprsente le chemin d'accs au fichier et \%f le nom du fichier. (il ne faut pas oublier le / entre \%h et \%f car ni l'un ni l'autre ne l'affichent). \%A introduit un lment de la date du dernier accs au fichier. Elment dfini par le caractre qui lui est accoll : A pour le jour de la semaine en toutes lettres, (un a minuscule aurait insr le jour en version abrge), d pour le quantime du mois, B pour le nom du mois, (de mme que pour le a, un b minuscule aurait insr la version abrge du mois), Y pour l'anne sur 4 chiffres ... je vous laisse deviner pour H, M et S. Et enfin le \n bien connu des programmeurs C et qui cre un retour la ligne. Pour illustrer les possibilits de find, nous avons choisi d'insrer nous mme chaque dtail composant la date dans la chane de format, mais pour ce cas prcis, nous aurions pu obtenir un rsultat similaire en utilisant moins de variables puisque la variable \%Ac donne elle seule la date (en abrg) et l'heure.
fn .-rnf"h% :driracsl %cn id pit %/f ene c e A\" .. . .GUtpDfut/idwae :driracsl mr2 jn20 1:02 CS /Nse/ealsWnoMkr ene c e e 8 u 04 95:0 ET .GUtpDfut/Moteu:driracsl mr2 jn20 1:02 CS /Nse/ealsWRoMn ene c e e 8 u 04 95:0 ET .. .

De la mme manire que \%A* permet d'afficher la date de dernier accs, il est possible de faire rfrence la

date de la dernire modification grce aux variables \%T*, ou encore la date de dernire modification du status du fichier avec les variables \%C*. Les nombreuses variables donnent d'ailleurs beaucoup d'autres possibilit comme par exemple, afficher le nom du propritaire du fichier (\%u), ou la taille de ce mme fichier en nombre de blocs de 512 octets (\%b), etc. Je vous invite consulter la page de manuel de find pour connatre l'ensemble des variables utilisables avec le paramtre -printf.

1.9 Que faire de tous ces rsultats


Bien que la liste ne soit pas exhaustive, vous pouvez constater la prcision avec laquelle find permet de trouver et afficher les informations. Mais cela ne s'arrte pas l ! Si nous avons dploy tous ces efforts pour trouver nos fichiers et/ou nos rpertoires, c'est pour en faire quelque chose. (les copier, les dplacer, les supprimer, changer leurs droits d'accs, etc). En plus de nous aider admirablement dans la recherche de nos prcieux fichiers, find nous permet d'enchaner notre recherche avec une action permettant d'exploiter les lments trouvs. Le paramtre -exec nous permet cet enchanement en excutant n'importe quelle commande du shell sur les fichiers issus de la recherche. Supposons par exemple que nous souhaitions supprimer tous les fichiers objets (*.o) d'un projet. Nous n'aurions qu' taper cette commande :
fn poe/r/-ae"."-xcr - { \ id rjtsc nm *o ee m f } ;

Nous utilisons ici la commande rm avec son paramtre -f pour ne pas avoir de confirmation donner. les accolades reprsentent l'occurence de chaque fichier trouv et l'antislash et le point virgule sont l pour cloturer la commande.