Shell script d'archivage de logs

LuffyyffuL Messages postés 8 Statut Membre -  
LuffyyffuL Messages postés 8 Statut Membre -
Bonjour,

J'essaie de faire un script me permettant d'archiver des fichiers .log se trouvant dans des dossiers "log".

Étant débutant dans ce domaine, je vais vous exposer tout ça en détail :

1 - Chercher dans une arborescence les dossiers "log",
2 - Dans chaque dossiers, compter le nombre de fichiers .log,
3 - Si les fichiers sont vieux de X jours, les compresser dans une archive,
4 - Déplacer l'archive vers une arborescence identique bis.

Exemple de l'arborescence :

/home/arbo1/dossier1/dossier2/log

Arborescence bis qui devra se créer :

/home/arbo2/dossier1/dossier2/log

Code :

.1 -
find . -name log -type d -exec echo '{}' +


J'ai bien le chemin de mes dossiers "log" qui est retourné.

.2 -
ls -A | wc -l 


Comment aller dans le path retourné des dossier logs ?
Sinon quand j'y vais à la main, j'ai bien le nombre de fichiers retourné.

.3 -
find *.log -mtime +30 -exec gzip log.tar {} \;


De ce côté, mes logs sont compressés un à un, alors que je veux une archive globale.

.4 -
mv *tar $ARCHIVE


Comment dire qu'on veut recréer l'arborescence principale dans un dossier source bis (arbo2/dossier1/dossier2/log) afin de déplacer cette archive dans le dossier log de l'arborescence bis ? Comment récupérer qu'une partie du path avec pwd ?

J'avais en tête de créer une fonction pour toutes ces étapes et de faire une boucle for pour chaque dossier "log" appeler cette fonction.

Merci d'avance
A voir également:

5 réponses

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Oui, en effet, j'ai fait de la merde à un moment donné. mais bon, je n'ai pas testé.
for folder in $(find . -name log -type d )
do :
    ls -A $folder| wc -l
    for file in $(find $folder *.log -mtime +30)
    do :
         if [ -e $folder.tar.gz ]
         then :
                tar -Azf $folder.tar.gz $file
         else
                tar -czf $folder.tar.gz $file
         fi
    done
    if [ -e $folder.tar.gz ]
         then mv $folder.tar.gz somewhere
    fi
done

ensuite, à toi de modifier pour que ça fonctionne ou que ça fasse ce que tu veux.
Là tu aura une archive pour chaque dossier de log et chaque archive contiendra que les vieux log (normalement).
2
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
salut.
une boucle for, ça me parait bien:
for folder in $(find . -name log -type d )
do :
    ls -A $folder| wc -l
    tar -czf $folder.tar.gz $(find $folder *.log -mtime +30)
    mv $folder.tar.gz somewhere
done
en gros, une base qui devrait fonctionner.
1
LuffyyffuL Messages postés 8 Statut Membre
 
merci pour la réponse, je vais étudier tout ça :)
0
LuffyyffuL Messages postés 8 Statut Membre
 
Ce script est pas mal, il permet de créer une archive du dossier "log" qui a des fichiers ".log" vieux de 30jours. Mais s'arrête dès qu'il a trouvé un dossier ayant de vieux ".log", s'il y a d'autres dossiers "log" avec de vieux ".log" il ne va pas les archiver.

Par contre s'il trouve un dossier "log" avec des ".log" trop récents, il passe bien au suivant.

Après ce que j'essaie de faire, ce n'est pas de compresser le dossier contenant une arborescence avec un dossier "log" et des fichiers ".log" vieux de X jours, mais de compresser les fichiers ".log" dans une archive.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LuffyyffuL Messages postés 8 Statut Membre
 
Je galère un peu ^^ j'ai pas compris entièrement ton script, mais j'ai fait ceci :

Il y des erreurs, et pourquoi "$folder/*.log" ne fonctionne pas ? Ai-je bien commenté ?

for folder in $(find . -name log -type d ) # Pour chaque dossiers "log" trouvé.
do :
	for file in $(find $folder *.log -mtime +30) # Pour chaque dossier log contenant des fichiers ".log" vieux de +30jours.
    do :
		tar czf archive-log.tar.gz $folder/*.log # Archiver les fichiers ".log".
	done
	
	if [ -e $folder.tar.gz ] # Si une archive existe.
         then mv *.tar.gz $ARCHIVE # Déplacer l'archive.
    fi
done
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
for folder in $(find . -name log -type d ) # Pour chaque dossiers "log" trouvé.
do :
	for file in $(find $folder *.log -mtime +30) # Pour chaque fichier".log" vieux de +30jours dans le dossier log.
    do :
		tar czf archive-log.tar.gz $folder/*.log # créer le fichier archive-log.tar.gz et ajouter tout les fichiers log de $folder
	done
	
	if [ -e $folder.tar.gz ] # Si une archive existe.
         then mv $folder.tar.gz $ARCHIVE # Déplacer l'archive. ATTENTION $ folder peut contenir des sous dossiers
    fi
done

J'ai compris que tu ne voulais archiver que les ".log" ayant plus de 30 jours.
0
LuffyyffuL Messages postés 8 Statut Membre
 
oui c'est ça ^^
0