Script de suppression d'arborescence

webotech Messages postés 1 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous,

je viens vers vous aujourd'hui car j'ai besoin de votre aide pour réaliser un petit script d'effacement de dossier en bash.

Je m'explique :

Dans mon projet, je possède un dossier MailsAttachment, dans celui-ci nous retrouvons un dossier pour chaque utilisateur de mon site, numéroté de 1 à n (n étant le dernier utilisateur donc). Dans chacun de ces dossiers utilisateurs, nous retrouvons un dossier pour chaque mail ouvert, qui contient par exemple les fichiers joints au mail.

Je souhaite donc mettre en place une crontask qui exécuterai ce script toutes les 24H, ce script aurai donc pour effet de supprimer le dossier des mails de chaque utilisateurs à partir du moment où ce dossier existerait depuis plus de 24H.

Je résume :

Exemple d'arborescence

>MailsAttachment

>1 -----> correspond au dossier du premier utilisateur

>1 -----> correspond au dossier temporaire du mail le plus ancien qui n'a pas encore dépassé les 24H

>2

>3

>4 -----> correspond au dossier temporaire du mail le plus récent qui n'a pas encore dépassé les 24H (le plus récent donc)

>2 -----> correspond au dossier du deuxième utilisateur

>1 -----> correspond au dossier temporaire du mail le plus ancien qui n'a pas encore dépassé les 24H

> ...

>n -----> correspond au dossier temporaire du mail le plus récent qui n'a pas encore dépassé les 24H

>3 -----> correspond au dossier des mails temporaire du dernier utilisateur

Nous avons donc ici 3 utilisateurs, le premier utilisateur possède 4 dossiers temporaires correspondants donc aux 4 derniers mails qu'il a reçu datant de moins de 24H. Le deuxième utilisateur possède n dossier de mails qu'il a reçu dans les dernières 24H, etc etc. Ceci est un exemple bien sûre, dans la réalité nous retrouverons beaucoup plus d'utilisateurs ainsi que beaucoup plus de mails par utilisateurs.

Le script devrait donc parcourir le dossier de chaque utilisateurs, et supprimer dans ce dossier les dossiers qui existent depuis plus de 24H.

Cela aura donc pour effet de garder en mémoire les pièces jointes des mails 24H seulement, au delà de ça elles seront supprimées.

Je m'occupe de toute la partie crontask, seulement ayant très très peu de connaissance en Bash j'avoue ne pas être capable de réaliser ce script, et je pense que pour quelqu'un qui connait bien le langage cela devrait être largement à porté (dû moins je pense).

Bonne fin de journée et merci à vous

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Le bash n'est pas très compliqué, et tu peux tester l'effet de chaque commande dans un shell :
    - pour lister des fichiers tu as la commande
    ls
    (
    ls -l
    notamment pour avoir la date)
    - dans ton cas lister le critère de choix des fichiers se fait facilement
    find
    (voir option
    -mtime
    )
    - la commande
    rm -f
    supprime un fichier (
    rm -rf
    pour un dossier)
    - enfin l'opérateur $(...) permet d'injecter le résultat d'un commande dans une autre.
    - une boucle
    for
    combinée avec un seq permet d'itérer facilement sur les dossiers utilisateurs
    - au besoin la commande
    echo
    permet d'afficher quelque chose

    Je te conseille de travailler avec un script à part (mettons
    /home/toto/script.sh
    ) et de faire tes tests à partir de là

    Une fois le fichier créé :

    cd /home/toto.sh
    chmod a+x script.sh
    ./script.sh


    Voici un début de squelette (il faut corriger le find)

    #!/bin/bash
    dir=/home/toto/mail
    for dossier in $(ls -1 $dir)
    do
        find ... $dossier
    done


    1) Commence par trouver le
    find
    qui va bien (avec des chemins absolus)
    https://www.developpez.net/forums/d1045062/systemes/linux/administration-systeme/chercher-fichiers-crees-entre-dates/

    2) Injecte ta commande
    find
    dans
    rm
    :
    rm $(find ...)


    Ensuite ton cron doit simplement appeler ce fichier aux heures voulues.

    Bonne chance
    0
    1. Flachy Joe Messages postés 2303 Statut Membre 261
       
      Salut,
      inutile d'utiliser
      rm $(find ...)
      , cf l'action -exec de find

      Par ailleurs, j'ai tendance à dire que si tu utilises une boucle dans un script bash, c'est que tu as loupé quelque chose. Il n'existe quasiment aucun cas trivial où tu ne peux pas remplacer la boucle par une simple commande.
      0
    2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       
      Merci pour tes remarques, pertinentes dans l'ensemble, mais qu'il me paraît important de nuancer :

      1) Il est effectivement possible d'utiliser -exec dans ce cas précis. Mais pour moi c'est juste un détail syntaxique (ça ne changera rien en terme de performances). L'avantage de l'opérateur
      $(...)
      ou
      `...`
      c'est qu'il n'est pas limités à
      find
      .

      2) Je suis d'accord qu'un
      |
      bien placé sera toujours plus rapide qu'un
      for
      et qu'il faut donc privilégier la première solution. Mais si
      for
      existe, c'est qu'il y a une vraie raison et notamment pas mal de cas triviaux qui ne me paraissent pas faisable autrement.

      Notamment :
      - les itérations sur une liste arbitraires

      users=toto tata titi
      for user in $users
      do
        ...
      done


      - plusieurs boucles imbriquées :

      for mail_dir in $mail_dirs
        for user in $users
          ...
        done
      done


      Là où je te rejoins c'est que si c'est résolu par une commande et que le traitement est simple, un
      | xargs
      peut faire l'affaire. Dans cet exemple, ce qui serait le "corps" du
      for
      est simple, donc ça va :

      ls -1 /home/toto | xargs ls -l


      ... mais dès qu'il devient compliqué (par exemple parce qu'ils contient plusieurs instructions, des tests, etc...), c'est au mieux illisible, voire au pire pas possible (typiquement si tu as besoin de faire
      break
      ).
      0
    3. Flachy Joe Messages postés 2303 Statut Membre 261
       
      @mamiemando : tu es assurément dans le vrai pour la relecture du code. Sinon, pour moi le bash reste du script de base. Pour les cas plus complexe j'utilise python, c'est quand même un peu plus sympa à écrire.

      En fait il n'y a même pas besoin de l'action -exec puisqu'il existe -delete ...
      0
    4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       
      Je valide ton choix :-)
      0
  2. UnGars
     
    Salut,

    Rien pigé à ton arborescence ;-(

    Installe la commande
    tree 
    si besoin et renvoie-nous le résultat de la commande :
    tree -d MailsAttachment
    -1