Script de suppression d'arborescence

Fermé
webotech Messages postés 1 Date d'inscription jeudi 11 février 2016 Statut Membre Dernière intervention 11 février 2016 - Modifié par webotech le 11/02/2016 à 08:57
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 - 15 févr. 2016 à 10:44
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
A voir également:

2 réponses

mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
11 févr. 2016 à 10:00
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
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 259
11 févr. 2016 à 20:02
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
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
12 févr. 2016 à 11:52
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
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 259
12 févr. 2016 à 17:12
@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
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
15 févr. 2016 à 10:44
Je valide ton choix :-)
0
Salut,

Rien pigé à ton arborescence ;-(

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