Script de suppression d'arborescence
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
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
-
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 commandels
(ls -l
notamment pour avoir la date)
- dans ton cas lister le critère de choix des fichiers se fait facilementfind
(voir option-mtime
)
- la commanderm -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 bouclefor
combinée avec un seq permet d'itérer facilement sur les dossiers utilisateurs
- au besoin la commandeecho
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 lefind
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 commandefind
dansrm
:rm $(find ...)
Ensuite ton cron doit simplement appeler ce fichier aux heures voulues.
Bonne chance-
-
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'unfor
et qu'il faut donc privilégier la première solution. Mais sifor
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" dufor
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 fairebreak
). -
-
-
-
Salut,
Rien pigé à ton arborescence ;-(
Installe la commandetree
si besoin et renvoie-nous le résultat de la commande :tree -d MailsAttachment