Linux-Mandrake:
Guide de l'utilisateur
et Manuel de référence

MandrakeSoft

 
 
Janvier 2000
http://www.linux-mandrake.com


Suivant : Installation en mode texte
Précédent : Installation d'un logiciel libre
Retour

(Retour à la table des matières)

Chapitre 2 : Les utilitaires en ligne de commande


Le but de ce chapitre est d'introduire un petit nombre d'outils en ligne de commande qui peuvent s'avérer utiles au quotidien. Bien sûr, vous pouvez passer ce chapitre si vous avez l'intention de n'utiliser qu'un environnement graphique, mais un rapide coup d'oeil peut vous faire changer d'avis :)

Ce chapitre n'est pas vraiment organisé. Les utilitaires sont listés comme ils viennent, des plus utilisés aux plus obscurs. Chaque commande sera illustrée par un exemple, mais il vous est laissé à titre d'exercice de lui trouver des usages plus utiles.

grep: General Regular Expression Parser (« analyseur syntaxique général d'expressions rationnelles »)

D'accord, le nom n'est pas très intuitif, pas plus que son acronyme, mais son utilisation est simple: chercher un motif donné en argument dans un ou plusieurs fichiers. Sa syntaxe est:

grep [options] <motif> [un ou plusieurs fichier(s)]

Si on a précisé plusieurs noms de fichiers, leur nom apparaît en début des lignes remplissant les critères du motif, à moins qu'on n'ait utilisé l'option -h. L'option -l a pour effet de n'afficher que le nom des fichiers dont au moins une ligne remplit les conditions du motif. Il est parfois utile, lorsque la liste des arguments est longue, de parcourir les fichiers à l'intérieur d'une boucle du shell et d'utiliser le truc suivant: grep <motif> <nom_de_fichier> /dev/null.

Le motif est une expression rationnelle, bien que la plupart du temps il ne consiste qu'en un simple mot. Les options les plus couramment utilisées sont les suivantes:

Voici un exemple d'utilisation:

$ cat victim
Hello dad
Hi daddy
So long dad
  # Chercher la chaîne "hi", peu importe la casse
$ grep -i hi victim
Hi daddy
  # Chercher "dad" comme un mot entier, et afficher
  #   le numéro de ligne en face de chaque ligne
  #   correspondante
$ grep -nw dad victim
1:Hello dad
3:So long dad
  # Chercher toutes les lignes ne commençant pas
  #   par un "H"
$ grep -v "^H" victim
So long dad
$

Si vous voulez utiliser grep dans un tube, vous n'avez pas à spécifier de nom de fichier, car par défaut, il prend son entrée depuis l'entrée standard. De même, par défaut, il affiche les résultats sur la sortie standard, donc vous pouvez sans crainte mettre la sorte de grep dans un autre tube. Par exemple:

$ cat /usr/doc/HOWTO/Parallel-Processing-HOWTO | \
  grep -n thread | less

find: trouver des fichiers en fonction de certains critères

find est un utilitaire Unix de longue date. Son but est de parcourir récursivement un ou plusieurs répertoires et d'y trouver des fichiers correspondant à un certain ensemble de critères. Bien qu'il soit très utile, sa syntaxe est vraiment complexe, et l'utiliser requiert une certaine habitude. La syntaxe générale est:

find [options] [répertoires] [critère] [action]

Si vous ne spécifiez aucun répertoire, find recherchera dans le répertoire courant. Si vous ne spécifiez pas de critère, c'est équivalent à « vrai », et donc tous les fichiers seront trouvés. Les options, critères et actions sont si nombreux que nous n'en mentionnerons que quelques-uns ici. Commençons par les options:

Un critère peut être un ou plusieurs tests atomiques; quelques tests utiles sont:

Beaucoup d'autres tests existent, référez-vous à la page de manuel pour plus de détails. Pour combiner ces tests, vous pouvez utiliser:

Enfin, vous pouvez spécifier une action pour chaque fichier trouvé. Les plus fréquentes sont:

Toujours là? Alors, maintenant entraînons-nous un peu, car c'est toujours la meilleure façon de comprendre le monstre. Supposons que vous vouliez trouver tous les répertoires dans /usr/share. Vous taperez alors:

find /usr/share -type d

Supposons que vous ayez un serveur HTTP, tous vos fichiers HTML sont dans /home/httpd/html, qui est aussi votre répertoire courant. Vous voulez trouver tous les fichiers qui n'ont pas été modifiés depuis un mois. Comme vous avez des pages de différents auteurs, certains fichiers ont une extension html et d'autres l'extension htm. Vous voulez lier ces fichiers dans le répertoire /home/httpd/obsolete. Vous taperez alors:

find ( -name "*.htm" -o -name "*.html" ) -a -ctime -30 -exec ln {} /home/httpd/obsolete ;[33]

D'accord, cette exemple est un peu compliqué et requiert quelques explications. Le critère est:

( -name "*.htm" -o -name "*.html" ) -a -ctime -30

qui fait ce que l'on veut: il recherche tous les fichiers dont le nom se termine soit par .htm, soit par .html (( -name "*.htm" -o -name "*.html" )), et (-a) qui n'ont pas été modifiés dans les 30 derniers jours, ce qui représente en gros un mois (-ctime -30). Notez les parenthèses: elles sont nécessaires ici, parce que -a a une priorité plus grande. S'il n'y en avait pas, tous les fichiers se terminant par .htm auraient été trouvés, plus tous les fichiers se terminant par .html et qui n'ont pas été modifiés depuis un mois, ce qui n'est pas ce que nous voulons. Notez également que les parenthèses sont désactivées par rapport au shell: si nous avions mis ( .. ) à la place de ( .. ), le shell les aurait interprétées et essayé d'exécuter -name "*.htm" -o -name "*.html" dans un sous-shell... Une autre solution aurait été de mettre les parenthèses entre doubles apostrophes ou simples apostrophes, mais une anti-barre oblique (backslash) est préférable ici dans la mesure où nous ne devons isoler qu'un seul caractère.

Et enfin, il y a la commande à exécuter pour chacun des fichiers:

-exec ln {} /home/httpd/obsolete ;

Ici aussi, vous devez désactiver le ; par rapport au shell, car autrement le shell l'interprétera comme un séparateur de commandes. Si vous ne le faites pas, find se plaindra qu'il manque un argument à -exec.

Un dernier exemple: vous avez un gros répertoire nommé /shared/images, avec toutes sortes d'images dedans. Régulièrement, vous utilisez la commande touch pour mettre à jour les dates d'un fichier nommé stamp dans ce répertoire, de façon à avoir une référence dans le temps. Vous voulez trouver tous les fichiers JPEG dans ce répertoire qui sont plus récents que le fichier stamp, et comme vous avez des images de diverses sources, ces fichiers ont des extensions jpg, jpeg, JPG ou JPEG. Vous voulez aussi éviter de rechercher dans le répertoire old. Vous voulez vous faire envoyer la liste de ces fichiers par courrier électronique, et votre nom d'utilisateur est jean:

find /shared/images -cnewer     \
     /shared/images/stamp       \
     -a -iregex ".*\.jpe?g"     \
     -a -not -regex ".*/old/.*" \
       | mail jean -s "Nouvelles images"

Et voilà! Bien sûr, cette commande n'est pas très utile si vous devez la taper à chaque fois, et vous voudriez l'exécuter régulièrement. Vous pouvez le faire:

crontab: afficher ou éditer votre fichier crontab

crontab est une commande qui vous permet d'exécuter des commandes à des intervalles de temps réguliers, avec l'avantage supplémentaire que vous n'avez pas à être connecté au système et que la sortie de ces commandes vous est envoyée par courrier électronique. Vous pouvez spécifier les intervalles en minutes, en heures, en jours et même en mois. crontab agira différemment en fonction des options:

Commençons par éditer un fichier crontab. Si vous tapez crontab -e, vous vous trouverez en face de votre éditeur de texte favori si vous avez initialisé la variable d'environnement 'EDITOR' ou 'VISUAL', autrement VI sera utilisé. Une ligne dans un fichier crontab est composée de six champs. Les cinq premiers sont les intervalles de temps en minutes, heures, jours dans le mois, mois et jours dans la semaine. Le sixième champ est la commande à exécuter. Les lignes commençant par un # sont considérées comme des commentaires et seront ignorées par crond (le programme en charge d'exécution des fichiers crontab). Voici un exemple de fichier crontab:

Note: afin de pouvoir imprimer l'extrait qui suit dans une police de caractères lisible, il nous a fallu ventiler les lignes les plus longues. C'est pourquoi certaines portions du texte doivent en réalité n'occuper qu'une seule ligne. Quand vous verrez le caractère '' terminer une ligne, cela signifiera que c'est en réalité la même ligne qui continue. Cette convention fonctionne dans les fichiers de type Makefile et dans le shell, ainsi que dans d'autres cadres.

# Si vous ne voulez pas recevoir de courrier,
#   « décommentez » la ligne suivante
#MAILTO=""
#
# Faire un rapport de toutes les nouvelles images
#   à 14h tous les deux jours, en partant de
#   l'exemple ci-dessus --- après ceci,
#   « retoucher » le fichier "stamp". Le « % » est
#   traité comme un retour chariot, cela vous
#   permet de mettre plusieurs commandes sur la
#   même ligne.
0 14 */2 * *  find /shared/images               \
  -cnewer /shared/images/stamp                  \
  -a -iregex ".*\.jpe?g"                        \
  -a -not -regex                                \
    ".*/old/.*"%touch /shared/images/stamp
#
# Jouer une mélodie tous les and à Noël :)
0 0 25 12 * mpg123 $HOME/musiques/joyeux_noel.mp3
#
# Imprimer la liste des courses tous les mardis
#   à 17 heures...
0 17 * * 2 lpr $HOME/liste-courses.txt

Il y a plusieurs autres moyens de spécifier des intervalles que ceux mentionnés dans l'exemple. Par exemple, vous pouvez spécifier un ensemble de valeurs discrètes séparées par des virgules (1,14,23) ou un intervalle (1-15), ou même combiner les deux (1-10,12-20), optionnellement avec un pas (1-12,20-27/2). Maintenant, il vous reste à trouver des commandes utiles à y mettre :)

at: programmer une commande, mais seulement une fois

Vous pouvez aussi vouloir exécuter une commande à un jour donné, mais pas régulièrement. Par exemple, vous voulez vous rappeler un rendez-vous, aujourd'hui à 18 heures. Vous employez X, et vous aimeriez être prévenu à 17h30, par exemple, que vous devez y aller. at est ce qu'il vous faut ici:

$ at 5:30pm
  # Vous vous retrouvez en face de l'invite de at
at> xmessage "C'est l'heure! rendez-vous à 18h"
  # Tapez C-d pour sortir
at> <EOT>
$

Vous pouvez spécifier la date de différentes manières:

at accepte aussi différentes options:

Comme d'habitude, voyez la page de manuel de at(1) pour plus d'options.

tar: Tape ARchiver (« archiveur sur bandes »)

Bien que nous ayons déjà vu une utilisation de tar dans le chapitre 18.0, nous n'avons pas expliqué son fonctionnement. C'est ce à quoi va s'employer cette section. De même que find, tar est un utilitaire Unix de longue date, et sa syntaxe est un peu spéciale:

tar [options] [fichiers...]

Voici maintenant une liste d'options. Notez que toutes celles-ci ont une option longue équivalente, mais vous devrez vous référer à la page de manuel pour cela car elles ne sont pas listées ici. Et bien sûr, toutes les options ne sont pas listées non plus :)

Note: le tiret initial (-) des options courtes est maintenant désuet pour la commande tar, sauf après une option longue.

Il y a beaucoup, beaucoup d'autres options, vous vous référerez à la page de manuel de tar(1) pour en obtenir une liste complète. Voyez, par exemple, l'option d. Maintenant, un peu de pratique. Supposons que vous vouliez créer une archive de toutes les images dans le répertoire /shared/images, compressée avec bzip2, de nom images.tar.bz2 et située dans votre répertoire personnel. Vous taperez alors:

#
 # Note: vous devez être dans le répertoire
 #   contenant les fichiers de l'archive!
 #
$ cd /shared
$ tar cyf ~/images.tar.bz2 images/

Comme vous pouvez le voir, nous avons utilisé trois options ici: c a dit à tar de créer une archive, y lui a dit que nous la voulions compressée avec bzip2, et f  /images.tar.bz2 lui a dit que l'archive devait être créée dans notre répertoire personnel, avec le nom images.tar.bz2. Maintenant, on peut vouloir vérifier si l'archive est valide. Nous pouvons simplement le vérifier en affichant la liste de ses fichiers:

#
 # Retour à notre répertoire personnel
 #
$ cd
$ tar tyvf images.tar.bz2

Ici, nous avons dit à tar d'afficher la liste (t) des fichiers de l'archive images.tar.bz2 (f images.tar.bz2), en ayant averti que cette archive était compressée avec bzip2 (y), et que nous voulions un format d'affichage long (v). Maintenant, supposons que vous ayez effacé le répertoire des images. Heureusement, votre archive est intacte, et maintenant vous voulez l'extraire à sa place originelle, dans /shared. Mais comme vous ne voulez pas casser votre commande find pour trouver les nouvelles images, vous devez préserver les attributs de tous les fichiers:

#
 # Rendez-vous dans le répertoire où vous voulez
 #   extraire
 #
$ cd /shared
$ tar yxpf ~/images.tar.bz2

Et voilà le travail!

Maintenant, supposons que vous vouliez seulement extraire le répertoire images/cars de l'archive. Vous pouvez alors taper ceci:

$ tar yxf ~/images.tar.bz2 images/cars

Au cas où cela vous inquiéterait, n'en faites rien: non; si vous essayez d'archiver des fichiers spéciaux, tar les prendra tels qu'ils sont, des fichiers spéciaux, et n'ira pas chercher leur contenu. Donc oui, vous pouvez mettre sans risque /dev/mem dans une archive :) Oh, et il gère aussi les liens correctement, donc ne vous en inquiétez pas non plus. Pour les liens symboliques, regardez également l'option h dans la page de manuel.

bzip2 et gzip: programmes de compression de données

Vous avez vu que nous avons déjà parlé de ces deux programmes quand nous avons évoqué tar. Contrairement à WinZip sous Windows, l'archivage et la compression sont faits en utilisant deux programmes séparés --- tar pour l'archivage, et les deux programmes que nous allons maintenant introduire pour la compression, bzip2 et gzip.

En premier lieu, bzip2 a été écrit en tant que remplacement pour gzip. Ses possibilités de compression sont en général meilleures, mais d'un autre côté il consomme plus de mémoire. La raison pour laquelle gzip est encore là est qu'il est encore beaucoup plus répandu que bzip2. Peut-être qu'un jour bzip2 remplacera complètement gzip, mais peut-être pas.

Les deux commandes ont une syntaxe similaire:

gzip [options] [fichier(s)]

Si aucun nom de fichier n'est donné, gzip comme bzip2 attendra des données sur l'entrée standard et enverra le résultat sur la sortie standard. Donc les deux programmes sont utilisables avec des tubes. Les deux commandes ont aussi un ensemble d'options similaires:

Attention! Par défaut, gzip et bzip2 effaceront le ou les fichier(s) qu'ils ont compressés (ou décompressés) si vous n'utilisez pas l'option -c. Vous pouvez l'éviter avec bzip2 en utilisant l'option -k, mais gzip n'a aucune option de la sorte!

Quelques exemples, maintenant. Supposons que vous vouliez compresser tous les fichiers se terminant par .txt dans le répertoire courant avec bzip2, vous utiliserez alors:

$ bzip2 -9 *.txt

Supposons que vous vouliez partager votre archive d'images avec quelqu'un, mais il ne dispose pas de bzip2, uniquement de gzip. Vous n'avez pas besoin de décompresser l'archive et de la recompresser, vous pouvez juste la décompresser sur la sortie standard, utiliser un tube, compresser depuis l'entrée standard et rediriger le résultat vers la nouvelle archive:

bzip2 -dc images.tar.bz2 | gzip -9 >images.tar.gz

Et voilà le travail. Vous pourriez avoir tapé bzcat au lieu de bzip2 -dc. Il existe un équivalent pour gzip mais son nom est zcat, et non pas gzcat. Vous disposez aussi de bzless (resp. zless) si vous voulez directement visualiser des fichiers compressés sans avoir à les décompresser avant. Comme exercice, essayez de trouver la commande que vous auriez à taper pour voir des fichiers sans les décompresser, et sans utiliser bzless or zless :)

Beaucoup, beaucoup plus...

Il existe tellement de commandes que si quelqu'un faisait un livre sur la totalité, vous auriez une encyclopédie en face de vous. Ce chapitre n'a même pas traité un dixième de pourcent, mais vous pouvez déjà faire beaucoup avec ce qui a été dit ici. Quelques pages de manuel que vous pourrez regarder si vous le souhaitez: sort(1), sed(1), zip(1) (oui, c'est bien ce que vous pensez, vous pouvez extraire/fabriquer des archives ZIP sous Linux), convert(1), et ainsi de suite. L'expérimentation reste le meilleur moyen de se familiariser avec ces outils, et vous leur trouverez probablement beaucoup d'utilisations auquelles vous n'auriez pas pensé au premier coup d'oeil. Amusez-vous bien :)


Suivant : Installation en mode texte
Précédent : Installation d'un logiciel libre
Retour

Copyright © 2000 MandrakeSoft