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
A voir également:
- Script de suppression d'arborescence
- Forcer suppression fichier - Guide
- Script vidéo youtube - Guide
- Suppression compte gmail - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
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 commande
- dans ton cas lister le critère de choix des fichiers se fait facilement
- la commande
- enfin l'opérateur $(...) permet d'injecter le résultat d'un commande dans une autre.
- une boucle
- au besoin la commande
Je te conseille de travailler avec un script à part (mettons
Une fois le fichier créé :
Voici un début de squelette (il faut corriger le find)
1) Commence par trouver le
https://www.developpez.net/forums/d1045062/systemes/linux/administration-systeme/chercher-fichiers-crees-entre-dates/
2) Injecte ta commande
Ensuite ton cron doit simplement appeler ce fichier aux heures voulues.
Bonne chance
- pour lister des fichiers tu as la commande
ls(
ls -lnotamment 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 -fsupprime un fichier (
rm -rfpour un dossier)
- enfin l'opérateur $(...) permet d'injecter le résultat d'un commande dans une autre.
- une boucle
forcombinée avec un seq permet d'itérer facilement sur les dossiers utilisateurs
- au besoin la commande
echopermet 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
findqui 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
finddans
rm:
rm $(find ...)
Ensuite ton cron doit simplement appeler ce fichier aux heures voulues.
Bonne chance
inutile d'utiliser , 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.
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 à .
2) Je suis d'accord qu'un bien placé sera toujours plus rapide qu'un et qu'il faut donc privilégier la première solution. Mais si 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
- plusieurs boucles imbriquées :
Là où je te rejoins c'est que si c'est résolu par une commande et que le traitement est simple, un peut faire l'affaire. Dans cet exemple, ce qui serait le "corps" du est simple, donc ça va :
... 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 ).
En fait il n'y a même pas besoin de l'action -exec puisqu'il existe -delete ...