Bonjour,

je recherche une solution "optimisée" pour la gestion de fichier horodaté au format <nom-fichier>_aaaammjj-hhmmss.
L'objectif de gérer au sein d'un dossier de sauvegarde la rétention du fichier par rapport à un nombre de jour défini et le nombre d'itération (limiter le nombre de fichier)

La solution ci-dessous fonctionne mais présente un délai de traitement conséquent.
Il est évident que je sous-exploite les possibilités du "find". Je pense d'ailleurs qu'il est possible à partir de cette fonction de traiter directement la retention et le nombre d'itération.

Je vous sollicite donc pour m'aider dans l'exploration d'autres solutions.

NOTA : le script est utilisé sur un NAS Synology.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# liste des fichiers horodates pour la purge
recherche_file=$(find "${pathDistantVersioning}" -type f | grep "${expReg}" | sort -r)
 
for filePathHorodate in ${recherche_file}; do
 
	# conserver horodatage du fichier
	longueur=$(echo $filePathHorodate | awk '{print length($0)}')
	longueur=$(($longueur - 14))	
	Horodate=$(echo $filePathHorodate | cut -c ${longueur}-)
 
	#date du fichier que l'on recupere
	vAnnee=$(echo "${Horodate}" | cut -c 1-4)
	vMois=$(echo "${Horodate}" | cut -c 5-6)
	vJour=$(echo "${Horodate}" | cut -c 7-8)
	vHeure=$(echo "${Horodate}" | cut -c 10-11)
	vMinute=$(echo "${Horodate}" | cut -c 12-13)
	vSeconde=$(echo "${Horodate}" | cut -c 14-15)
	vdateDossier="${vAnnee}-${vMois}-${vJour} ${vHeure}:${vMinute}:${vSeconde}"
 
	#date du fichier en secondes
	t1=`date --date="${vdateDossier}" +%s`
	#date du jour en secondes
	t2=`date --date="${dateJour}" +%s`
	# Difference entre les 2 dates en secondes
	let "tDiff=$t2-$t1"
	# puis en jours
	let "tDiff=$tDiff/3600/24"
 
	# si le fichier est trop ancien, suppression
	if [ $tDiff -gt $nbRetention ]; then
		#rm -f "${filePathHorodate}"
		if [ $? -eq 0 ]; then
			Fct_Log "[INFO] Purge par date de ${filePathHorodate}" "${ficLog}" 
			res1=$(($res1 + 1))
		else
			Fct_Log "[ERREUR] Purge par date de ${filePathHorodate} IMPOSSIBLE" "${ficLog}"
			resultat=$(($resultat + 1))
		fi
	fi
 
	# conserver le nom fichier (suppression chemin et horodatage)
	longueur=$(echo $filePathHorodate | awk '{print length($0)}')
	longueur=$(($longueur - 16))	
	filePATH=$(basename $(echo $filePathHorodate | cut -c 1-${longueur}))	
 
	# Chemin du fichier
	dir=$(dirname "${filePathHorodate}")
 
	# nombre d'iteration du fichier	au sein de la meme arborescence		
	nb=$(find ${dir} -maxdepth 1 -name "*${filePATH}_*" | wc -l)
		# si le nombre d'iteration est supŽrieur ˆ la limite
	if [ $nb -gt $nbVersion ]; then
 
		val=1
		# recherche de tous les fichiers de meme nom au sein d'une meme arborescence
		liste=$(find ${dir} -maxdepth 1 -name "*${filePATH}*" | cat $1 | sort -r)	
 
		for i in ${liste}; do
			if [ $val -gt $nbVersion ]; then
				#rm -f "${i}"
				if [ $? -eq 0 ]; then
					Fct_Log "[INFO] Purge par version de ${i}" "${ficLog}"
					res2=$(($res2 + 1))
				else
					Fct_Log "[ERREUR] Purge par version de ${i} IMPOSSIBLE" "${ficLog}"
					resultat=$(($resultat + 1))
				fi
			fi
			val=$(($val + 1))
		done
	fi  	
 
	# Si le dossier est vide, suppression
	if [ $(find "${dir}" -type f | wc -l) -eq 0 ]; then
		#rm -rf "${dir}"
		if [ $? -eq 0 ] ; then
			Fct_Log "[INFO] Suppression du dossier vide ${dir}" "${ficLog}"
			res3=$(($res3 + 1))
		else
			Fct_Log "[ERREUR] Suppression du dossier vide ${dir} IMPOSSIBLE" "${ficLog}"
			resultat=$(($resultat + 1))
		fi
	fi	              		
done