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 :

Tar gz des fichiers par date de création


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut Tar gz des fichiers par date de création
    Bonjour à tous,

    J'ai un petit soucis de script ...
    Mon besoin :
    - J'ai + de 8000 fichiers dans un répertoire et je voudrais les compresser par date. j'ai environ 20 fichiers par jour.

    Problème :
    A priori on ne peut pas faire une commande tar qui créé ou ajoute suivant le cas, ça ne fais que l'un ou l'autre.
    Du coup mon script écrase le fichier précédent...
    Pour info tout mes fichiers ont le format "xxx_YYYY_MM_DD_xxx.log"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for file in $(find . -name "*.log") # Pour chaque dossier log contenant des fichiers ".log" vieux de +30jours.
    do :
    	tar czf gim_csv_$(date -r $file '+%y%m%d').tar.gz ./$file # Archiver les fichiers ".log".
    done


    Vous avez une idée ?

    Merci de votre aide.
    Matt22

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par matt22 Voir le message
    Bonjour à tous,

    J'ai un petit soucis de script ...
    Mon besoin :
    - J'ai + de 8000 fichiers dans un répertoire et je voudrais les compresser par date. j'ai environ 20 fichiers par jour.
    Donc, si j'ai bien compris, en lisant entre les lignes, tu voudrais regrouper dans un tar compressé tous les fichiers dont la date (de création ou de dernière modification) est le même jour.

    A priori, je vois 2 méthodes envisageables, soit une boucle sur les dates, soit une boucle sur les fichiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Boucle sur les dates
    Pour toutes les dates entre il y a longtemps et maintenant
      trouver tous les fichiers correspondant à cette date
      S il y en a au moins un,
        faire un tar avec ces fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Boucle sur les fichiers
    Pour chaque fichier log,
      récupérer sa date au jour près
      déterminer le nom du fichier tar correspondant à cette date
      si ce fichier n existe pas encore
      alors en créer un contenant le fichier log
      sinon ajouter le fichier log au fichier tar
    La 2ème méthode me semble plus générale (pas de présupposé sur les dates), mais moins efficace.

    Cependant, dans ton cas particulier, comme tu indiques que le nom de tes fichiers est bien formaté "xxx_YYYY_MM_DD_xxx.log", du coup, la 1ère me paraît très simple à mettre en place car tu peux récupérer la liste des dates avec un simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf '%s\n' *.log | sed -e 's/.*\([1-2][0-9][0-9][0-9]_[0-1][0-9]_[0-3][0-9]\).*/\1/' | sort -un
    # ou
    printf '%s\n' *.log | grep -o '[1-2][0-9][0-9][0-9]_[0-1][0-9]_[0-3][0-9]' | sort -un
    EDIT: J'ai oublié la correction de cette ligne (voir remarque de N_BaH plus loin)
    echo *.log | grep -o '[1-2][0-9][0-9][0-9]_[0-1][0-9]_[0-3][0-9]' | sort -un #
    /EDIT

    Du coup, la boucle sur les dates est triviale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for date in $(echo *.log | grep -o '[1-2][0-9][0-9][0-9]_[0-1][0-9]_[0-3][0-9]' | sort -un)
    do echo "pour la date ${date}, les fichiers sont:"
      echo *${date}* # cas particulier où, pour une fois, on n'entoure pas la variable de guillemets!!!
    Jack (du 22 )

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    Merci pour ton aide,

    Grace à ta piste j'ai pu écrire mon petit script :

    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
    #!/bin/ksh
     
    for file in $(echo *.log | grep -o '.*[1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9].*' | sort -un)
    do
    if [ ! -f *$(date -r $file '+%y%m%d').tar ];then
      echo "create titi_$(date -r $file '+%y%m%d').tar with ${file}"
      tar cvf titi_$(date -r $file '+%y%m%d').tar ./$file # Archiver le fichier ".log".
      #rm ./$file
    else
      echo "add ${file}, to titi_$(date -r $file '+%y%m%d').tar"
      tar rvf titi_$(date -r $file '+%y%m%d').tar ./$file # Ajouter le fichier ".log".
      #rm ./$file
    fi
    done
     
    for file in $(echo *.tar)
    do
      echo compress $file
      gzip ./$file
    done
     
    for file in $(find . -name "*.tar.gz" -mtime +30)
        do :
            # supprimer les fichiers ".tar.gz".
    		echo delete $file
            #rm ./$file
        done
     
    for file in $(find . -name "*.log" -mtime +7)
        do :
            # Supprimer les fichiers ".log".
    		echo delete $file
            #rm ./$file
        done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ls -1 *.log
    blabla.log
    xxx-2017_11_25-yyy.log
    xxx-2017_11_29-yyy.log
    grep est-il vraiment indispensable ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $ printf '%s\n' *[12][0-9][0-9][0-9]_[1-3][0-9]_[0-3][0-9]*.log
    xxx-2017_11_25-yyy.log
    xxx-2017_11_29-yyy.log
    et comment sort peut-il trier les éléments d'une même ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo *.log | grep -o '.*[1-2][0-9][0-9][0-9]_[0-1][0-9]_[0-3][0-9].*'
    xxx-2017_11_25-yyy.log xxx-2017_11_29-yyy.log
    d'ailleurs, quel est l'intérêt de trier les fichiers ?

    voici un petit remaniement, avec d'autres commentaires:
    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
    #!/bin/bash
    for file in *[12][0-9][0-9][0-9]_[1-3][0-9]_[0-3][0-9]*.log
    do
     #AÏE ! si il existe plusieurs fichiers ayant un nom avec un suffixe identique, ça va coincer !
       if test -f *$(date -r $file '+%y%m%d').tar
       then
          echo "add ${file}, to titi_$(date -r $file '+%y%m%d').tar"
     # il doit être possible de trouver un moyen plus économique qui n'appellerait pas tar pour chaque fichier. un/des tableau(x) ?
          tar rvf titi_$(date -r $file '+%y%m%d').tar ./$file
          #rm ./$file
       else
          echo "create titi_$(date -r $file '+%y%m%d').tar with ${file}"
     # apparemment le préfixe est connu et fixe : "titi_"
          tar cvf titi_$(date -r $file '+%y%m%d').tar ./$file
          #rm ./$file
       fi
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    Tu réécris un système de sauvegarde ? Si ça n'est pas juste pour l'exercice de style, tu pourrais te pencher ver bacula.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    et comment sort peut-il trier les éléments d'une même ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo *.log | grep -o '.*[1-2][0-9][0-9][0-9]_[0-1][0-9]_[0-3][0-9].*'
    xxx-2017_11_25-yyy.log xxx-2017_11_29-yyy.log
    Oui, N_BaH! J'ai corrigé mon post précédent.

    d'ailleurs, quel est l'intérêt de trier les fichiers ?
    Je persiste à dire que je préfère la boucle sur les dates plutôt que sur les fichiers (voir ci-dessous).

    Le "sort" sert à trier les dates et non les fichiers, et surtout à n'en garder qu'un exemplaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for date in $(printf '%s\n' *.log | grep -o '[1-2][0-9][0-9][0-9]_[0-1][0-9]_[0-3][0-9]' | sort -un)
    do tar cvf ${date}.tar *${date}*.log
    done

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    Merci de votre aide.

    * En effet le print est plus propre.

    * Pourquoi pas bacula : Parce que je n'ai pas les droits pour installer des composants

    Merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tri de fichier par date de création
    Par seveldan dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/02/2011, 08h37
  2. [XL-2003] Lire des fichiers par date de modification
    Par K2O2$ dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/05/2010, 19h11
  3. Sélection des fichiers par date
    Par bramy dans le forum Linux
    Réponses: 1
    Dernier message: 06/12/2006, 19h10
  4. Classer des fichiers par date
    Par lorentdups dans le forum Langage
    Réponses: 3
    Dernier message: 01/10/2006, 17h14
  5. Batch - Choisir un fichier par date de création
    Par Lorponos dans le forum Windows
    Réponses: 10
    Dernier message: 07/05/2006, 18h19

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