Gestion des fichiers sous Unix/Linux

Organisation logique des fichiers

Nous allons découvrir l'organisation des fichiers sous Unix

Démarrer Linux Ubuntu sur un poste de la salle Gif 10

Dans Applications ouvrir un Terminal

Entrer firefox puis faire Entrée, puis aller sur mathly récupérer le Tp

Le système de gestion de fichiers d'Unix (ou de Linux), structure la mémoire du disque dur (attention ! ce n'est pas la mémoire vive) sous la forme d'un arbre dont les noeuds sont soit des répertoires soit des fichiers

Un répertoire peut contenir d'autres répertoires ou des fichiers

Voici la disposition des répertoires pour le système Linux (Ubuntu)

Quand on ouvre un terminal on se trouve dans le répertoire du nom de l'utilisateur avec lequel on s'est connecté à la machine

Ce répertoire matérialisé par le symbole tilde ~ est plus précisement dans la structure hiérarchique de l'organisation des fichiers /home/nom_utilisateur

/ (lire slash) est la racine de l'arbre dont les enfants sont les répertoires visibles sur la copie d'écran ci-dessus

Entrez la commande pwd (pour print working directory) pour l'observer sur votre machine

Sur la copie d'écran ci-dessous l'utilisateur s'appelle jp "chez" l'ordinateur appelé vhjp (c'est le sens de jp@vhjp) et le répertoire courant est /home/jp

Unix/Linux est un système multi-utilisateurs donc plusieurs utilisateurs peuvent utiliser le même ordinateur, chaque utilisateur a son répertoire dans le répertoire home

Dans le répertoire de chaque utilisateur on trouve au moins les répertoires Documents, Images et Téléchargements

Entrez dans le terminal la commande


ls -R

(pour list)Cette commande va lister le contenu du répertoire de l'utilisateur de manière récursive (c'est le rôle de l'option -R), ainsi dans le terminal tout l'arbre de l'utilisateur va être affiché de manière récursive et on verra affiché le contenu des sous-répertoires de jp, ainsi par exemple le sous-répertoire ./Documents: puis en colonne le contenu du sous-répertoire Documents de jp

Le symbole ./ signifie le répertoire courant (On reverra cela plus loin)

Il nous faut préciser ici la notion de chemin absolu et de chemin relatif

Pour bien comprendre ces notions le mieux est de pratiquer avec un fichier ex.html et une image chat.png

Télécharger le fichier ex.txt puis enregistrer le sous ex.html dans Documents

Télécharger chat.png dans Documents

Le but de la manipulation est qu'au lancement de la page ex.html par le navigateur, l'image chat.png soit affichée

Ceci n'est possible que si dans la balise img le paramètre src (pour source) est correctement renseigné, par l'adresse absolue ou relative de l'image par rapport à ex.html

Un fichier ou un répertoire est repéré absolument par rapport à la racine /, ainsi le répertoire jp dans l'exemple ci-dessus a pour chemin absolu

/home/jp

Comment le fichier html va trouver l'image ?

  1. on donne l'adresse absolue de l'image, c'est à dire

    /home/jp/Documents/img.png

    Ce qui est un peu long !

  2. On donne l'adresse relative de l'image, ici c'est simple car on travaille souvent ainsi en mettant les fichiers dans le même répertoire autrement dit l'adresse relative est img.png

    On peut aussi écrire src="./chat.png", ./ signifiant aller chercher l'image dans le répertoire courant où est exécuté le programme, ici Documents

Exercices

On va maintenant déplacer l'image non pas en utilisant les outils graphiques mais avec les commandes du terminal

Entrez dans le terminal (on suppose que vous êtes dans votre répertoire personnel à votre nom qui ne s'appelle évidemment pas jp, il faut adapter ...)


mv Documents/chat.png Images/chat.png

La commande mv pour move déplace l'image à partir de son adresse relative Documents/chat.png vers sa nouvelle adresse relative Images/chat.png

Pour vérifier que l'image est bien déplacée vous pouvez soit le faire graphiquement soit entrez dans le terminal


cd Images

cd signifie change directory et vous permet de vous déplacer dans l'arbre et quitter votre répertoire et "descendre " d'un niveau et d'aller dans le répertoire Images

Pour remonter d'un niveau dans l'arbre peu importe où on se trouve on entre la commande suivante


cd ..

Les deux points .. représentent le répertoire père de celui où vous êtes

Maintenant pour voir le contenu du répertoire Images et constater que l'image s'y trouve bien entrez la commande


ls

Maintenant vous en savez assez pour pratiquer par vous-même

  1. Il faut changer le contenu de src sinon la page ex.html n'affichera pas l'image

    Pour passer de ex.html qui est dans Documents à chat.png qui est maintenant dans Images on doit remonter dans le répertoire "père" puis descendre dans Images

    Donc src="../Images/chat.png"

    Essayez

  2. Dans le répertoire Documents on va créer un nouveau répertoire nommé html

    On se déplace d'abord dans le répertoire Documents,(à vous de jouer) si vous ne savez plus où vous êtes faites pwd

    Une fois que vous êtes dans bien dans Documents entrez dans le terminal

    
    mkdir html
    
    

    mkdir pour make directory va créer le répertoire dont le nom suit la commande, et donc html est un répertoire enfant de Documents

  3. Fermer le navigateur et déplacer le fichier ex.html dans le répertoire html puis ouvrir ex.html avec le navigateur

    Vous observez que l'image ne s'affiche plus et donc il faut mettre à jour l'attribut src dans le fichier ex.html

Droits des fichiers

A chaque fichier sont associés des droits

Puisque plusieurs personnes peuvent utiliser la même machine, à chaque fichier créé sont associés un certain nombre de droits

Placer vous dans votre répertoire Documents puis entrer la commande suivante

    
        ls -l
    

Vous pouvez voir sur chaque ligne en plus du nom du fichier ou du répertoire une suite de lettres séparées en trois groupes

  1. Le premier groupe concerne l'utilisateur c'est à dire le créateur du fichier
  2. Le deuxième groupe concerne le groupe principal dans lequel se trouve le créateur du fichier
  3. Le troisième groupe concerne les autres utilistaurs de la machine

Exercices

  1. Créer un fichier texte vide fichier.txt avec la commande suivante
        
            touch fichier.txt
        
    
  2. On veut donner aux autres membres de l'équipe du propriétaire le droit à l'écriture sur ce fichier Entrez la commande suivante
        
            chmod g+w fichier.txt
        
    
  3. Avec quelle commande vérifier que la modification a été bien faite ?

Scripts bash

Le droit d'exécution qui permet de rendre un fichier exécutable et de pouvoir éventuellement réaliser des actions potentiellement dangereuses pour l'intégrité de la machine est plus encadré que les autres modes. Nous allons découvrir cela sur un exemple

Dans son répertoire personnel Alice a un répertoire Rapports contenant des rapports de stage sous forme de fichier texte

Elle aimerait pour chaque fichier afficher le nombre de mots contenus dans le fichier

Pour automatiser cela elle a crée le script bash ci-dessous

Ouvrir l'éditeur de textes gedit et entrer le code suivant, puis enregistrer ce fichier dans le ~ sous le nom compter_mots.sh

    
    #!/bin/bash  
    #$1 est le contenu du répertoire passé en paramètre
    liste_fichiers=$(ls $1) 
    echo NOMBRE DE MOTS
    for fichier in $liste_fichiers
    do 
          #le script est exécuté dans ~, l'adresse relative est $1/$fichier
          wc -w $1/$fichier
    done

  1. Observer que compter_mots.sh n'a pas de droits d'exécution
  2. Donner à ce fichier les droits d'exécution uniquement pour le propriétaire
  3. Avant d'exécuter ce script créer un répertoire Rapports dans le ~ et y mettre deux fichiers texte
  4. Pour exécuter le script entrer la commande suivante
        
            ./compter_mots.sh Rapports
        
    

    Explication: Il existe une variable d'environnement PATH contenant tous les répertoires contenant des exécutables comme /bin ,/usr/bin etc... aussi pour lancer un exécutable il y a deux solutions

    1. Soit c'est un exécutable faisant partie d'une catégorie d'exécutables bien répertoriés dans le PATH comme les applications courantes comme un navigateur etc... dans ce cas il suffit d'entrer le nom de l'application et faire entrée
    2. Si c'est un script bash et vous n'en faites pas souvent dans ce cas il faut entrer l'adresse absolue du script autrement dit dans notre cas

          
              /home/user/compter_mots.sh Rapports
          
      

      qu'il est plus court d'écrire

          
              ./compter_mots.sh Rapports
          
      

      . signifiant le répertoire courant

    3. A moins que ~ soit dans le PATH dans ce cas on procède comme en 1)
    4. Pour le savoir affiche le contenu de la variable PATH

Traitement de données en tables avec le bash

Un fichier .csv (comma separated values) permet de stocker des données nombreuses avec une taille "raisonnable"

On peut le considérer comme un ensemble de lignes et de colonnes sur lequel on peut faire des recherches

On va par exemple travailler sur un fichier (anonymisé) contenant les choix de spécialité des élèves de première du LVC de l'année 2019 -2020 pour l'année suivante 2020-2021

  1. On va télécharger un fichier .csv du site mathly.fr avec la commande wget,mais comme au Lycée on a accès au réseau Internet via un proxy, on utilise l'option -e avec paramètres use_proxy=on et http_proxy=10.0.0.1:3128

    
    wget -e use_proxy=on -e http_proxy=10.0.0.1:3128 http://www.mathly.fr/terminale_20_21.csv 
    
    
    

    Le fichier terminale_20_21.csv est enregistré dans le répertoire courant

    Pour afficher la première ligne du fichier terminale_20_21.csv (métadonnées)

    On entre la commande

                    
    head -n1 terminale_20_21.csv
    
    
  2. On veut sélectionner les lignes du fichier terminale_20_21.csv contenant le motif 'Numérique et sciences informatiques'

                    
        grep 'Numérique et sciences informatiques' terminale_20_21.csv
    
    
  3. On veut sélectionner les colonnes du fichier terminale_20_21.csv contenant la spécialité Numérique et sciences informatiques

    Il faut tenir compte des métadonnées

    Il faut sélectionner le champ numéro 2 (field) avec le délimiteur (;)

                    
    cut -d';' -f2 terminale_20_21.csv
    
    

    Le résultat de cette commande est affichée dans le terminal

    On aimerait conserver le résultat dans un fichier spe_terminale.txt

    On va rediriger la sortie non pas vers le terminal mais vers le fichier spe_terminale.txt

        
    cut -d';' -f2 terminale_20_21.csv>spe_terminale.txt 
    
    
  4. Quelle commande entrer pour sélectionner dans le fichier spe_terminale.txt uniquement les lignes contenant Numérique et sciences informatiques?
  5. Quelle commande entrer pour compter le nombre d'élèves qui font la spécialité Numérique et sciences informatiques en Terminale?