Tuto Shell Débutant

Introduction

Vous venez d'installer Linux sur votre PC et vous êtes émerveillé par le libre. Mais là vous vous demandez comment copier, renommer, déplacer, supprimer, etc... un fichier. Bien sur vous pouvez ouvrir votre explorateur de fichier et le faire à la main. D'accord ça marche mais comment faire dans un dossier pour supprimer tous les fichiers commençant par c ou p et de taille inférieure à 10ko tout en faisant attention à ne pas supprimer les fichier dont l'extension est .c ?
Pas facile hein ... ;)
Ne vous inquiétez pas avec une console tout cela se fait en une ligne.
Alors commençons.

Qu'est-ce qu'une console ?

Et oui on s'adresse ici aux débutants.
Pour ouvrir une console sous Gnome allez dans Applications->Accessoires->Terminal
Vous obtenez une fenêtre toute blanche (ou noire) avec quelque chose comme cela d'écrit :

user@ordi:~$

Voila vous êtes dans une console !!!!
C'est d'ici que tout ce passe. On va voir comment utiliser des fonctions sur cette console.

Les fonctions en shell

Comment se sert-on d'une fonction ?

Alors on est là devant notre jolie console et que fait-on ?
On va se servir de fonctions. Pour cela il faut savoir comment on appelle une fonction (on verra par la suite les noms de fonctions, pour le moment on fait de la théorie :) ). Pour appeller une fonction on tape juste le nom de la fonction suivie de ses options et arguments (si il y en a). La différence entre les options et les arguments est que les options sont précédées d'un tiret.
Voila un exemple d'appel d'une fonction :

user@ordi:~$ fonction -options argument1 argument2 ...
# ou bien
user@ordi:~$ fonction argument1 argument2 ... -options

Voila c'est tout simple. Comme on le voit l'ordre entre les arguments et les options n'a pas énormément d'importance et les deux appels précédents sont équivalents. Bien entendu ça ne parle pas beaucoup comme ça, mais comme on dit "rien ne vaut l'expérience", alors voyons les fonctions de base.

La fonction pwd

C'est la première fonction que nous verrons : "pwd" (Print Working Directory) soit en français : imprimer le répertoire courant. Testons la :

user@ordi:~$ pwd
/home/user

On est dans le répertoire /home/user. On appelle aussi ce répertoire : le répertoire "~" (prononcez "tilde").

La fonction ls

Fonction très utile "ls". Allez-y tapez ls dans votre console vous devez avoir un résultat du type

user@ordi:~$ ls
at76_usb-0.17         bashrc  Desktop  MEMOVIF.PDF         rapport.tex  tp3
at76_usb-0.17.tar.gz  bluej   latex    rapport_latin1.tex  tp2          WinDLX

Bien sur c'est surement différent chez vous. Vous avez compris ce que faisait cette fonction : elle liste les fichiers du répertoire courant.

Vous me direz : "C'est bien beau tout ça mais comment on fais pour savoir si on a un dossier ou un fichier exécutable ?"
C'est là que les options interviennent. Pour ls une options pratique est -l :

user@ordi:~$ ls -l
drwxr-xr-x 2 aad users  4096 jan  4 18:31 at76_usb-0.17
-rwx------ 1 aad users 55539 jan  2 02:56 at76_usb-0.17.tar.gz
-rw-r--r-- 1 aad users  2379 jan 10 03:20 bashrc
drwx------ 4 aad users  4096 sep 19 17:51 bluej
drwx------ 2 aad users  4096 sep 27 16:13 Desktop
drwxr-xr-x 4 aad users  4096 jan 10 03:20 latex
-rw------- 1 aad users 49309 jan  2 02:32 MEMOVIF.PDF
-rw-r--r-- 1 aad users  7006 déc  6 18:14 rapport_latin1.tex
-rw-r--r-- 1 aad users  7044 déc  6 18:11 rapport.tex
drwx------ 8 aad users  4096 sep 19 18:17 tp2
drwx------ 6 aad users  4096 sep 27 16:13 tp3
drwxr-xr-x 3 aad users  4096 déc  7 16:30 WinDLX

Là plein de choses sont apparues. Voyons ce que l'on apprend. Tout d'abord le début de la ligne (drwxr-xr-x par exemple pour la première ligne) : cela correspond au type de fichier et aux droits des utilisateurs sur ce fichier. le d signifie directory (dossier) -> on a donc un dossier. Si on a un tiret c'est qu'on a un fichier classique.
Le reste sont les droits en lecture(read), écriture(write), exécution (executable) des utilisateurs ; les trois premières lettres correspondent aux droits du propriétaire, les trois suivantes à ceux des utilisateurs appartenant au groupe du fichier, les trois dernier aux autres utilisateurs.
Après cela on a dans l'ordre : le propriétaire, le groupe, la taille en octet du fichier, la date de la dernière modification du fichier (mois, jour, heure), le nom du fichier.

Une autre option intéressante est -a (all) qui permet d'afficher tous les fichiers (même les cachés). Sous Linux les fichiers cachés commencent par un ".". Testons-la :

user@ordi:~$ ls -a
.                     .fontconfig        .povray
..                    .gconf             .qt
.adobe                .gconfd            rapport_latin1.tex
.appletviewer         .gimp-2.2          rapport.tex
at76_usb-0.17         .gnome             .recently-used.xbel
at76_usb-0.17.tar.gz  .gnome2            .ssh
.bash_history         .gnome2_private    .thumbnails
.bash_logout          .gstreamer-0.10    tp2
.bash_profile         .gtkrc-1.2-gnome2  tp3
bashrc                .ICEauthority      .Trash
.bashrc               .icons             .viminfo
.beagle               .java              .wapi
bluej                 .kde               WinDLX
.bluej                latex              .Xauthority
.config               .macromedia        .xchat2
Desktop               MEMOVIF.PDF        .xscreensaver
.dmrc                 .metacity          .xsession-errors
.fbrc                 .mozilla
.fluxbox              .nautilus

On voit plein de nouveaux fichiers. Ce sont les fichiers de configurations Linux. Pas la peine de s'attarder sur eux pour le moment.

Ce que l'on peut faire maintenant c'est combiner les options. Par exemple :

user@ordi:~$ ls -a -l

On a les deux options à la fois. Ce code donnera la même chose que  user@ordi:~$ ls -al .
D'autres options intéressantes sont : -h, -d, -s. Je vous laisse découvrir par vous même leur utilité. Nous verrons plus loin une méthode pour pouvoir connaitre les options d'une fonction.

La fonction cd

Maintenant que l'on peut connaitre les différents fichiers du répertoire courant, voyons comment se balader dans les différents répertoires.
Pour cela on utilise la fonction cd pour "change directory". cette fonction permet de se déplacer dans l'arborescence des dossiers. On se sert de cette fonction comme suit : user@ordi:~$ cd RépertoireCible
Par exemple si je tape ls j'ai :

at76_usb-0.17         bashrc  Desktop  MEMOVIF.PDF         rapport.tex  tp3
at76_usb-0.17.tar.gz  bluej   latex    rapport_latin1.tex  tp2          WinDLX

Desktop est un dossier. Je peux donc entrer dedans par :

user@ordi:~$ cd Desktop
user@ordi:~/Desktop$  #On est dans le répertoire Desktop

Pour revenir en arrière il suffit de faire  cd ..
.. est un dossier spécial représentant le répertoire au dessus du répertoire courant.

user@ordi:~/Desktop$ cd ..      #On remonte dans l`arborescence
user@ordi:~$ 

Si la cible que l'on donne n'est pas un répertoire ou n'existe pas on génère une erreur :

user@ordi:~$ cd MEMOVIF.PDF      #La cible est un fichier
bash: cd: MEMOVIF.PDF: N`est pas un répertoire
user@ordi:~$ cd çanexistepas     #La cible n`existe pas
bash: cd: çanexistepas: Aucun fichier ou répertoire de ce type

La fonction cp

La fonction cp, comme copy, permet de copier un fichier ou un répertoire. Cette fonction est assez simple a utiliser : cp [OPTIONS] SOURCE DESTINATION où SOURCE est le fichier ou répertoire à copier et DESTINATION l'endroit où SOURCE est copiée.
Exemple :

user@ordi:~$ ls
Books   Code       driver_wifi_80211g.zip  goldie.avi     Images      john-1.7.2.tar.gz  Musique  Vidéos
Bureau  Documents  Examples                gtk-cours.pdf  john-1.7.2  Modèles            Public
user@ordi:~$ cp john-1.7.2.tar.gz Documents/
user@ordi:~$ ls Documents/
el201  en201a  in201  john-1.7.2.tar.gz  ma201  ma211_annales.tar.gz  pr201.tar.gz  sh201

Dans cet exemple, john-1.7.2.tar.gz est SOURCE et Document est DESTINATION. On ne s'est pas servi de OPTION car il n'est pas obligatoire d'en utiliser. Cependant certaines options sont assez pratiques :

  • cp -r ou cp -R: permet de copier un répertoire (recursive)
  • cp -i : permet de demander confirmation avant d'écraser un fichier déjà existant (interactive)
  • cp -v : permet d'utiliser le mode verbose : cp devient alors très bavard

Comme pour ls, il n'est pas interdit d'utiliser plusieurs options à la fois ; ainsi cp -rvi Document/en201a ~/cours permet de de copier le répertoire en201a situé dans ./Document vers /home/user/cours.

user@ordi:~$ ls
Books   Code   Documents               Examples    gtk-cours.pdf  john-1.7.2         Modèles  Public
Bureau  cours  driver_wifi_80211g.zip  goldie.avi  Images         john-1.7.2.tar.gz  Musique  Vidéos
user@ordi:~$ cp -rvi Documents/en201a/ ~/cours
`Documents/en201a/` -> '/home/user/cours/en201a'
`Documents/en201a/en201a3_v2.pdf` -> '/home/user/cours/en201a/en201a3_v2.pdf'
`Documents/en201a/en201a4_v2.pdf` -> '/home/user/cours/en201a/en201a4_v2.pdf'
`Documents/en201a/en201a3_v1.pdf` -> '/home/user/cours/en201a/en201a3_v1.pdf'
user@ordi:~$ ls cours/
en201a

Les 3 options citées précédemment ne sont pas inutiles puisque qu'on les retrouve dans beaucoup d'autres commandes pour le même usage.

La fonction rm

La fonction rm, comme remove, permet de supprimer définitivement un fichier. Attention rm ne demande aucune confirmation et une fois que le fichier est supprimé il est impossible de le récupérer. Donc il faut être très prudent lorsqu'on utilise rm. Tip : l'utilisation de rm -i permet d'éviter les accidents aussi je conseille vivement de toujours utiliser rm -i à la place de rm, on peut même aller jusqu'à faire un alias dans son bashrc.
Exemple :

user@ordi:~$ ls Documents/
el201  en201a  in201  john-1.7.2.tar.gz  ma201  ma211_annales.tar.gz  pr201.tar.gz  sh201
user@ordi:~$ rm -i Documents/john-1.7.2.tar.gz 
rm: remove regular file `Documents/john-1.7.2.tar.gz`? oui
user@ordi:~$ ls Documents/
el201  en201a  in201  ma201  ma211_annales.tar.gz  pr201.tar.gz  sh201

NB : rm ne peut pas détruire un répertoire, il faut utiliser rmdir qui permet de supprimer un répertoire vide. Si l'on veut effacer un répertoire non-vide il faut utiliser l'option -R de rm.
Quelques options utiles à savoir :

  • rm -f : force le système à effacer le fichier et passe-outre les vérifications (comme avec l'option i par exemple). Attention soyez prudent !
  • rm -R : permet d'effacer un répertoire.

L'étoile de la mort

Maintenant que l'on sait copier et supprimer des fichiers on va s'intéresser au méta-caractères. "Mais qu'est ce que c'est ?" Ce sont des caractères spéciaux qui représentent plusieurs autres caractères. Pour mieux voir leur utilité je vais les tester sur le dossier suivant :

user@ordi:~$ ls
test1  test2  test3  testA  testF  testAZ

Ces caractères sont les suivants :

  • [] : Les crochets permettent de dire que le caractère à la place des crochet doit être dans la liste des caractères entre les crochets. Exemple :

    user@ordi:~$  ls test[12]
    test1  test2

    Pour désigner tous les caractères entre a et q par exemple on utilise le tiret :

    user@ordi:~$ ls test[A-Q] #équivalent à ls test[a-q]
    testA  testF
  • ? : Le point d'interrogation représente n'importe quel caractère. Il ne représente cependant pas le caractère vide. Exemple :
    user@ordi:~$ ls test?    #On cherche les fichier du nom de test suivi d`un seul caractère
    test1  test2  test3  testA  testF
    user@ordi:~$ ls test??   #Ici suivi de deux caractères
    testAZ
    user@ordi:~$ ls test???  #Ici de trois
    ls: test???: Aucun fichier ou répertoire de ce type
  • * : L'étoile. Le caractère le plus dangereux car il représente toutes les chaînes de caractères, y compris la chaîne vide "". Exemple :
    user@ordi:~$ ls test*    #tous les fichiers dont le nom commence par test.
    test1  test2  test3  testA  testAZ  testF
    user@ordi:~$ ls t*       #tous les fichiers dont le nom commence par t.
    test1  test2  test3  testA  testAZ  testF
    user@ordi:~$ rm *        #Attention : On supprime tous les fichiers sans demande de confirmation
    user@ordi:~$ ls          #On vérifie et le dossier est vide
    user@ordi:~$

    Comme on le voit l'étoile est dangereuse car sans faire attention on peut lancer $ rm -r * qui supprime tous les fichiers du répertoire courant sans confirmation. Alors, on ne le répétera jamais assez, faites attention avec l'étoile.

La fonction mv

mv comme move, permet de déplacer des fichiers et des dossiers. Ce qui veux bien dire que le fichier n'existe qu'en un seul exemplaire à la fin de la commande, par opposition à une copie.

man

Voici une section spéciale car man n'est pas une commande comme cp, cd, ls ou encore rm qui permet de naviguer sur son disque dur ou de toucher aux fichiers. Non man permet de consulter les pages de manuel et c'est très important; car dans 9 cas sur 10 lorque l'on se demande comment marche une commande ou encore quelles options permettent de copier un fichier tout en gardant les anciennes versions en backup, la réponse se touve dans la page man. Bien plus encore man contient également de l'aide précieuse pour le programmeur C ; car de nombreuses pages man sur les librairies standards existent. Essayez donc man printf ou encore man cp. Attention sur certaines distributions Linux, les pages man ne sont pas installées complètement; c'est le cas sur Ubuntu. Pour les installer il faut taper cette ligne de commande dans la console et saisir son mot de passe :

sudo apt-get install manpages manpages-dev manpages-posix manpages-posix-dev

Si vous n'êtes pas sous Ubuntu ou Debian, il faut utiliser le gestionnaire de paquets de votre distribution pour ça renseignez-vous soit sur le site de la distribution Linux en question soit sur google. Après avoir vu ces quelques commandes de base et appris à vous servir des pages man, vous voilà fin prêt à devenir un expert de la console un pur tétard bash ou encore un hardcore g33k qui code sous emacs en console.

Et pour finir commence à te former tout seul : man man !