Shell script d'archivage de logs

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

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    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).
    1. Contributeur
      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. 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.
        1. 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
          1. Contributeur
            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.
          2. oui c'est ça ^^