Script de nettoyage - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 12-05-2005 à 12:01:23
plusieurs choses à faire :
- différencier les noms des répertoires qui ne sont pas effaceables de ceux dont les fichiers peut être supprimées.
ex: no_del_xxxxx comme nom à un répertoire à garder
ainsi il sera plus aisé de détecter les répertoires à analyser
- j'espère que tes fichiers ne comportent pas d'espaces
faire une moulinette qui transforme les espaces en underscores
- si il peut avoir plusieurs niveaux d'arborescence dans les dossiers alors je suggère de passer à un algorithme récursif
Marsh Posté le 12-05-2005 à 12:20:01
Arborescence répertoire DigiFilm
/home/DigiFilm/
Dans DigiFilm tous les répertoires et les fichiers de plus de 1 jour sont à effacer.
Arborescence répertoire pvd
/home/pvd/
/home/pvd/7/
/home/pvd/9/
/home/pvd/10/
/home/pvd/11/
/home/pvd/13/
/home/pvd/15/
/home/pvd/20/
/home/pvd/30/
/home/pvd/40/
/home/pvd/50/
Dans pvd tous les répertoires et les fichiers de plus de 1 jour sont à effacer dans les répertoires 7,9,10,11,13,15,20,30,40 et 50.
Les fichiers ne comportent pas d'espaces.
Un algorithme récursif ???
Loption r avec FIND ?
Merci
Marsh Posté le 12-05-2005 à 12:34:42
je suppose que dans /home/pvd et /home/DigiFilm il y a des dossiers ou fichiers utilisateurs (.bashrc ou .kde,...)
alors ce que je propose :
- renommer les dossiers à analyser analys_***
- faire un ls |fgrep "analys" pour récupérer les répertoires à analyser puis à l'aide d'une boucle For, faire des appels à find
Marsh Posté le 12-05-2005 à 12:44:58
pvd et DigiFilm ne sont pas des répertoires utilisateurs.
Ce sont des répertoires crée par moi, et sont partager par Samba.
Si jai bien comprit le mieux est de faire find rechercher à la racine de pvd, les fichiers et les répertoires a effaces, et dexclure les répertoires a ne pas effaces ?
Merci
Marsh Posté le 12-05-2005 à 13:03:31
si il n'y a pas de possibilité de renommer les répertoires alors je propose un script de ce type :
rep_a_analyser="7 9 10 11 13 15 20 30 40";
for rep in "$rep_a_analyser"; do
cd "/home/pvd/$rep"
for i in `find ./ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
done;
Marsh Posté le 12-05-2005 à 13:22:44
Pour les recherches et les suppressions des fichiers en .BEL et .inflight jai modifié avec ton exemple les lignes suivantes.
Avant :
cd /home/pvd/7/
for i in `find /home/pvd/7/ -type f -atime +1 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/7/ -type f -atime +1 -name "*.inflight"` ; do rm $i ; done ;
Après :
rep_a_analyser=7 9 10 11 13 15 20 30 40 50" ;
for rep in "$rep_a_analyser" ; do
cd "/home/pvd/$rep"
for i in `find ./ -type f -atime +1 -name "*.BEL" "*.inflight"` ; do rm $i ; done ;
done ;
Pour les recherches et les suppressions des répertoires jai modifié avec ton exemple les lignes suivantes.
Avant :
for i in `find /home/pvd/7/* -type d -atime +1` ; do rm -rf $i ; done ;
Après :
rep_a_analyser=7 9 10 11 13 15 20 30 40 50" ;
for rep in "$rep_a_analyser" ; do
cd "/home/pvd/$rep"
for i in `find ./ -type d -atime +1` ; do rm $i ; done ;
done ;
Merci pour laide encore.
Le script est pour un serveur en production.
Jai une machine pour faire les testes, mais je galère depuis sa création.
Jai un deuxième script à faire pour une machine qui comporte de milliers de fichiers.
Alors si avec quelque ligne je peux résoudre le problème, bin je suis preneur.
Javance petit à petit.
Marsh Posté le 12-05-2005 à 13:35:52
Petit problème :
bris@scenux:~/prod$ ./script_de_nettoyage.sh
./script_de_nettoyage.sh: line 16: cd: /home/bris/prod/pvd/7 9 10 11 13 15 20 30 40 50: Aucun fichier ou répertoire de ce type
find: les chemins doivent précéder l'expression
Usage: find [CHEMIN] [EXPRESSION]
J'ai lancer ce bout de script :
rep_a_analyser="7 9 10 11 13 15 20 30 40 50" ;
for rep in "$rep_a_analyser" ; do
cd "/home/bris/prod/pvd/$rep"
for i in `find ./ -type f -cmin +1 -name "*.BEL" "*.inflight"` ; do rm $i ; done ;
done ;
Marsh Posté le 12-05-2005 à 13:41:17
remplace
for rep in "$rep_a_analyser"; do
par :
for rep in `echo "$rep_a_analyser"`; do
Marsh Posté le 12-05-2005 à 16:36:45
Enfin je passe la premier étape.
rep_a_analyser="7 9 10 11 13 15 20 30 40 50" ;
for rep in `echo "$rep_a_analyser"` ; do
cd "/home/bris/prod/pvd/$rep"
for i in `find ./ -type f -cmin +1 -name "*.BEL"` ; do rm $i ; done ;
for i in `find ./ -type f -cmin +1 -name "*.inflight"` ; do rm $i ; done ;
for i in `find ./ -type d -cmin +1` ; do rm -rf $i ; done ;
done ;
Je continue de faire des éssais.
Merci jlighty
Je ne pense pas que j'ai fini.
Marsh Posté le 12-05-2005 à 16:43:27
surtout pour un script effacant des fichiers sur une machine de production il ne faut pas hésiter de le tester à fond
Marsh Posté le 12-05-2005 à 16:56:14
Voici le script complet.
# Bloc 1
rep_a_analyser="7 9 10 11 13 15 20 30 40 50" ;
for rep in `echo "$rep_a_analyser"` ; do
cd "/home/bris/prod/pvd/$rep"
for i in `find ./ -type f -cmin +1 -name "*.BEL"` ; do rm $i ; done ;
for i in `find ./ -type f -cmin +1 -name "*.inflight"` ; do rm $i ; done ;
for i in `find ./ -type d -cmin +1` ; do rm -rf $i ; done ;
done ;
#Bloc 2
cd /home/DigiFilm/
for i in `find /home/bris/prod/DigiFilm/ -type f -cmin +1 -name "*.dfb"` ; do rm $i ; done ;
for i in `find /home/bris/prod/DigiFilm/* -type d -cmin +1` ; do rm -rf $i ; done ;
Cette ligne avec """for i in `find /home/bris/prod/DigiFilm/* -type d -cmin +1` ; do rm -rf $i ; done ;""" le * pour effaces tous les répertoire y'a pas un équivalent plus propre ?
Et aussi le script n'execute pas les trois for dans le bloc 1.
Marsh Posté le 12-05-2005 à 17:09:46
Petit erreur de ma par le bloc 1 fonctionne correctement.
Mais le * pour effaces tous les répertoires dans DigiFilm me
Marsh Posté le 12-05-2005 à 17:11:19
normalement on n'a pas besoin de *, avec "find /home/bris/prod/DigiFilm -type d" on récupère tous les dossiers
Marsh Posté le 12-05-2005 à 17:37:56
Dans lavenir sa va bien maider à faire des scripts et des petits programme.
Mais pour trouver comment faire les scripts, cest avec la pratique ou cest dans des livres etc
?
Code :
|
Je copie les fichiers et les répertoires sur mon poste en local pour faire des essais.
Je ne veux pas effaces tous les jobs à cause dune erreur dans le script.
Je pense que sur ce point jlighty ta raison.
Oula il y a des milliers de fichiers et répertoire à copies.
Marsh Posté le 12-05-2005 à 17:45:13
J'ai déjà eu à faire un script de purge automatique des fichiers, un conseil remplace tous tes rm -f par des "echo rm -f $i" puis tu rediriges l'affichage du script dans un fichier
Marsh Posté le 12-05-2005 à 18:00:59
Je vais tenter de faire ce que tu ma conseille.
Code :
|
Pour le remplacement de tous les rm -f par des "echo rm -f $i" la modification dont j'ai faite est bonne ?
Petit détail quand je demande au script d'efface tous les répertoires dans DigiFilm sans le * il efface aussi le répertoire DigiFilm.
J'ai sa aussi comme erreur :
rm: ne peut détruire le répertoire `./': Argument invalide
Marsh Posté le 12-05-2005 à 18:04:31
attention TOUS tes rm $i
donc lignes 4,5,6,10,11
do echo rm -f $i -> do echo "rm -f $i"
Marsh Posté le 12-05-2005 à 18:13:58
concernant
Citation : Petit détail quand je demande au script d'efface tous les répertoires dans DigiFilm sans le * il efface aussi le répertoire DigiFilm. |
comme find affiche en premier "./" (don DigiFilm) il suffit de faire :
Citation : `find /home/bris/prod/DigiFilm -type d -cmin +1 | tail +2 ` |
Marsh Posté le 12-05-2005 à 18:20:27
Merci tu m'aide beaucoup
Code :
|
Avec les :
do echo "rm -f $i"
ou
do echo "rm $i"
il me montre sur la console les fichiers à effaces mais ne me les effaces pas.
Marsh Posté le 12-05-2005 à 18:22:21
ben c'est le but ?
c'est pour éviter les bugs de script. Après chaque exécution du script, regarde les fichiers qui seraient supprimés. Dès que tu es sûr du script alors tu supprimes les echos
Marsh Posté le 12-05-2005 à 18:51:28
Merci
Demain je vais finir le reste.
Pour réglé :
rm: ne peut détruire le répertoire `./': Argument invalide
Avec :
| tail +2
Marsh Posté le 12-05-2005 à 18:57:52
l'explication réside dans le fait que "find" affiche dès la première ligne "./" donc si on prend en compte l'affichage qu'à partir de la deuxième ligne (| tail +2) -> plus de "./"
Marsh Posté le 12-05-2005 à 21:22:34
Demain je vais faire les modif.
Le (| tail +2) est a mettre dans tous les (find ./) ?
Marsh Posté le 12-05-2005 à 21:28:51
non puisque ./ est un dossier donc il faut mettre "| tail +2" uniquement aux endroits où l'on a "find ...... -type d"
Marsh Posté le 12-05-2005 à 21:36:17
ok
Pour reproduire les multiples fichiers et répertoires du taf chez moi, c'est
Merci pour l'info.
Par contre pour le 2eme script sa sera plus facile, parceque les répertoires sont en grands nombres.
100x100x100
Marsh Posté le 12-05-2005 à 21:41:59
plusieurs manières :
soit tu rappatries les fichiers du boulot chez toi (je sais pas si c'est légal)
soit tu utilises le couple mkdir / touch pour créer des fichiers et des répertoires
ex:
Code :
|
Edit :encore des bugs
Marsh Posté le 12-05-2005 à 21:54:47
Et bin y'a solution a tous.
Moi qui me suis fait chié à crée des répertoire, mais je suis pas allé jusqu'a 1000000.
Merci bien
Marsh Posté le 13-05-2005 à 09:50:45
Jai un problème avec le bloc DigiFilm.
Sur ma Debian ou jessais le script tous fonctionne bien.
Code :
|
Mais les machines de production sont sur des SuSE version 9.x.
Et le script efface le répertoire racine DigiFilm.
Code :
|
Marsh Posté le 13-05-2005 à 09:52:18
Alors il faudrait que tu tapes :
"find ./ | more" et régarde les premières lignes
Citation : |
où il est "| tail +2" ?
Marsh Posté le 13-05-2005 à 09:57:33
J'ai fait la modif sur le script de test et de prod.
Prod :
Code :
|
Test :
Code :
|
Je test.
Marsh Posté le 13-05-2005 à 10:04:46
Le script fonctionne sans effacer le répertoire DigiFilm, merci jlighty.
Mais je voudrais savoir pourquoi le script effacé le répertoire avant ?
Voilà maintenant le script fini je pense.
Code :
|
Marsh Posté le 13-05-2005 à 10:47:21
Je lance le script par cron, tous les jours.
Un petit chmod +x script_de_nettoyage pour le rendre exécutable.
Le script est placer dans /etc/cron.daily/ et effaces les fichiers et les répertoires de plus de trois jours.
Mais on ma demande dexclure le samedi et le lundi.
Pour exclure le samedi et le lundi il y a une option avec find ou je jongle avec le cron ?
Marsh Posté le 13-05-2005 à 10:53:29
Citation : Mais je voudrais savoir pourquoi le script effacé le répertoire avant ? |
Citation : l'explication réside dans le fait que "find" affiche dès la première ligne "./" donc si on prend en compte l'affichage qu'à partir de la deuxième ligne (| tail +2) -> plus de "./" |
tu as meilleur temps de configurer cron
Marsh Posté le 13-05-2005 à 11:05:17
Ok. pour ./
Il y a : cron.d, cron.daily, cron.hourly, cron.monthly et cron.weekly
Mais on peut crée sont propre cron ?
Marsh Posté le 13-05-2005 à 11:05:27
pour la crontab
0 0 * * 0,2,3,4,5 root <script de purge>
<script de purge> sera appelé à minuit tous les mardis,mercredi,jeudi,vendredi,dimanche
(si dimanche est aussi exclu : 0 0 * * 2-5 root <script de purge> )
http://www.linux-pour-lesnuls.com/crontab.php
Marsh Posté le 12-05-2005 à 11:54:45
Bonjour,
Le script en question droit effacer tous les fichiers *.dfb et les répertoires dans le répertoire DigiFilm qui sont plus vieux de 1 jour.
Effacer tous les fichiers *.BEL, *.inflight et les répertoires dans les répertoires 7,9,10,11,13,15,20,30,40 et 50 qui sont plus vieux de 1 jour.
Je voudrais peaufiner le script de nettoyage pour le rendre moins long et plus sure.
Jai trouvé pour linstant que /* pour effacer tous les répertoires.
Bientôt le nombre de répertoire à nettoyer sera de 0 à 99 et dans c'est même répertoire de 0 à 99.
Il faudra que jexclue des répertoires etc Mais je galère pour le finir.
Merci davance.
#!/bin/sh
# Le 20/04/2005
# Script de nettoyage
cd /home/DigiFilm/
for i in `find /home/DigiFilm/ -type f -cmin +1440 -name "*.dfb"` ; do rm $i ; done ;
for i in `find /home/DigiFilm/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/7/
for i in `find /home/pvd/7/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/7/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/7/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/9/
for i in `find /home/pvd/9/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/9/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/9/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/10/
for i in `find /home/pvd/10/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/10/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/10/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/11/
for i in `find /home/pvd/11/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/11/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/11/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/13/
for i in `find /home/pvd/13/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/13/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/13/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/15/
for i in `find /home/pvd/15/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/15/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/15/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/20/
for i in `find /home/pvd/20/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/20/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/20/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/30/
for i in `find /home/pvd/30/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/30/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/30/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/40/
for i in `find /home/pvd/40/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/40/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/40/* -type d -cmin +1440` ; do rm -rf $i ; done ;
cd /home/pvd/50/
for i in `find /home/pvd/50/ -type f -cmin +1440 -name "*.BEL"` ; do rm $i ; done ;
for i in `find /home/pvd/50/ -type f -cmin +1440 -name "*.inflight"` ; do rm $i ; done ;
for i in `find /home/pvd/50/* -type d -cmin +1440` ; do rm -rf $i ; done ;
Merci davance.