TD numéro 3 du cours système du MMFAI 1998-99 dirigé par Serge Vaudenay.

Fichiers et répertoires

  1. Faire un programme en Perl qui admet une série d'arguments, et qui, pour chaque argument argi effectue une liste des fichiers récursivement à partir du chemin d'accès argi. Cette liste ne devra pas afficher le nom des répertoires au milieu des fichiers, et devra indenter les fichiers à chaque fois que l'on descend dans un sous-répertoire.
    [
    corrigé]

  2. Faire un programm fatfilter en Perl qui recherche les gros fichiers à partir d'un répertoire donné. Ce programme filtre les fichiers dont l'extension est spécifiée dans le fichier .fatfilterrc. Les extensions inconnues devront être demandées à l'utilisateur (dans un mode interactif).
    [
    corrigé]

  3. L'objet de cet exercice est de construire un logiciel permettant de maintenir identiques deux répertoires sur des disques différents. Par exemple, si l'on travaille indifféremment sur une station fixe en réseau ou sur un portable, il faut répercuter les mises à jour de fichiers d'une machine à l'autre.

    Faire un programme Perl update qui admet une série d'arguments et d'options. Les arguments sont des noms de fichiers ou de répertoires. S'il n'y en a pas, on considère l'argument par défaut donné par la variable d'environnement $HOME. Les options suivantes (qui sont exclusives) décrivent le travail à effectuer.

    • -h
      Affiche un message d'aide.
    • -i
      Cette option consiste à faire la liste récursive de tous les fichiers à partir des chemins d'accès spécifiés par les arguments (comme dans l'
      exercice 1). Cette commande devra mettre à jour une base de données enregistrée dans le fichier .updtate. Les noms de fichiers seront accompagnés des renseignements nécessaires aux opérations suivantes (date de la dernière modification, ...). Cet option n'utilise pas la notion de mode intéractif.
    • -s Effectue le travail de l'option -i en repérant les fichiers modifiés, détruits, renommés ou déplacés et en indiquant les instructions shell à exécuter pour restituer les fichiers. (Si rien n'a changé, le fichier .update est à jour.) Pour cela, on effectue les actions suivantes.
      1. On repère le plus petit entier i tel que les fichiers .updatei.tgz et .updatei n'existent pas.
      2. On fait une première passe pour les fichiers effacés, déplacés ou renomés. Pour chaque fichier renommé ou déplacé, mais non modifiés, ajoute une ligne dans le fichier .updatei contenant
          "<ancien_fichier> -> <nouveau_fichier>"
        Pour chaque fichier détruit et tous les autres fichiers déplacés ou renomés, ajoute une ligne dans le fichier .updatei contenant
          "<fichier> ->"
      3. On fait une deuxième passe pour tous les fichiers modifiés. Pour chaque fichier modifié, ajoute une ligne dans le fichier .updatei contenant
          "<fichier>"
      4. Lance un éditeur de fichier sur .updatei pour permettre à l'utilisateur de faire des modifications.
      5. Effectue la liste <liste> de .updatei et de tous les fichiers <fichier> spécifiés par une ligne du fichier .updatei sans "->". Effectue la commande shell
          "tar czvf .updatei.tgz <liste>"
    • (défaut)
      Traite successivement tous les fichiers .updatei.tgz existants en restituant les modifications de fichiers, et détruit ces fichiers. Pour cela, on effectue les opérations suivantes.
      1. Extraie la base de données .update dans un fichier temporaire, et vérifie qu'aucune modification ultérieure n'est intervenue. (Sinon, le signale à l'utilisateur.)
      2. Extraie le fichier .updatei, et pour chaque ligne de ce fichier avec "->", effectue une commande shell: rm ou mv.
      3. Effectue la commande shell
          "tar xzvf .updatei.tgz"
      (On pourra demander à l'utilisateur confirmation des modifications à effectuer au préalable.)
    Comparer avec rdist.
    [corrigé]