IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Gestion Fichier horodate


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2
    Par défaut Gestion Fichier horodate
    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

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    quel interpréteur ?
    si bash, tu peux remplacer les nombreux cut, et les awk par le Remplacement de paramètres adéquat.

    PS: tu peux, sans influencer la rapidité d'exécution, rationaliser l'emploi de ` `, ou $( )
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour,

    Personnellement, je le ferais en une ligne.

    Tu fais la liste des fichiers avec find.
    Tu extrais l'horodatage avec awk et ne gardes que les noms de fichier (pas les dates...) qui dépassent la date ou alors ceux qui sont surnuméraires.
    Tu envoies cette liste à xargs rm.


    Il y a peut-être un critère de choix dans les fichiers non-périmés, autre que le nombre trop grand, mais tu ne le dis pas.

    Si ton but n'était pas de supprimer les fichiers surannés, reformule ton besoin.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2
    Par défaut
    Merci pour vos retours.

    mon interpreteur est "sh"

    Le premier objectif est bien de determiner si la date-heure présente en fin du nom des fichiers additionner avec le nombre de jours de rétention. dépassent la date du jour.
    je pense cette commande peut être faite en 1 ligne mais je suis en difficulté sur ce point.

    Concernant le versionning, la fonction actuelle n'est vraiment pas idéale que ce soit pour la recherche et le traitement.

    Cdlt.

Discussions similaires

  1. Gestion fichiers joints
    Par delavega dans le forum ASP
    Réponses: 7
    Dernier message: 21/09/2006, 15h58
  2. gestion fichiers sous linux
    Par felix14 dans le forum Langage
    Réponses: 3
    Dernier message: 14/09/2006, 15h52
  3. [Gestion fichiers] Erreur surprenante
    Par Pixcoder dans le forum C
    Réponses: 7
    Dernier message: 14/09/2006, 10h11
  4. gestion fichiers
    Par natie_49 dans le forum C++
    Réponses: 4
    Dernier message: 11/03/2006, 22h45
  5. Problème de gestion fichiers
    Par glutock dans le forum ASP
    Réponses: 2
    Dernier message: 08/04/2004, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo