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 :

Archivage et condition


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut Archivage et condition
    Salut,

    Suite à un espace disque saturé sur une machine d’intégration. Je souhaite faire un archivage automatique mensuel (lancement du script via crontab).

    Je suis donc parti sur une script de compression .tar.bz2 pour un meilleur gain de place.
    Le hic, je voudrais qu'il m'archive tout les fichiers >30J en excluant certain dossier/fichier (extension particulière).
    Et nettoyer ce qui est archivé, le script étant exécuter une fois mensuellement.

    J'ai commenté là où je calle pour la fonction des >30J

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    #Archivage.sh
    EXT=  # type de fichier
    NOM= 	#nom de fichier
     
    for i in /home/dossier/aaa; do
    tar -cjf  /home/dossier/aaa/$NOM.tar.bz2 --exclude '/home/dossier/aaa/bbb' /home/archive <= #fonction de date pour archiver les fichiers >30J
    rm #nettoyage des fichiers archivers > 30J
    done
    Tous les fichiers ont le même entête, incrémenter soit du numéro de jour de l'année en extension, soit de la date.

    Ce qui donne TESTINT.054 TESTINT.055 ou TESTINT.20130227....Je suis parti à archiver puis nettoyer, je sais que je pourrai faire aussi un move suivi de ma compression, mais dans tout les cas j'aurai un RM pour nettoyer les fichiers ajoutés à l'archive.

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

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

    je chercherais et exclurais les fichier souhaités avec find, dont j'enverrais la sortie à tar :
    Code non-éprouvé : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... -mtime ... | tar -cjf tonArchive -T -
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Dans mon man j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -daystart Mesurer les temps (avec -amin, -atime, -cmin, -ctime, -mmin, et -mtime) depuis le début de la journée plutôt que depuis 24 heures.
    Cela prendrai donc la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find /mondossier/ -name $NAME -mtime 30 | tar -cjf  /home/dossier/aaa/$NOM.tar.bz2 | rm -f   #si nom spécifique
    find /mondossier/ -type $EXT -mtime 30 | tar -cjf  /home/dossier/aaa/$NOM.tar.bz2 | rm -f   #si fichier excel
    Si je comprends bien que mtime compte le nombre de jour par rapport à la date actuel.

    Je pense qu'ill me manque une condition aussi sur le RM aussi, ou coupler avec le FIND ainsi il va m'effacer les fichiers trouvés (j'utilise rarement find couplé à rm par sécurité)

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Bonjour,

    ATTENTION: le -type de find n'a aucun rapport avec l'extension d'un fichier, ici on parle du type sur un point de vu système:
    pour fichier ordinaire


    pour répertoire
    Etc...

    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    et, deux find, oui, mais, un pour archiver, et un autre (± identique) pour -exec rm \+.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Merci encore une fois pour votre aide bien explicative à tous les deux

    Je partage quand même le final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    #Archivage.sh
    #EXT=  # type de fichier par extension
    NAME= 	#nom de fichier
    find /mondossier/ -type f $NAME -mtime 30 | echo tar -cjf  /home/dossier/aaa/$NOM.tar.bz2 #recherche fichier puis compression
    find /mondossier/ -type f $NAME -mtime 30 | echo rm -f   #recherche fichier puis delete
    Juste à retirer les echo

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    en espérant ne pas avoir le manque de bol qu'un nouveau fichier soit créé pile poil entre les 2 find... (le chipoteur fou...)

  8. #8
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Non ça va les fichiers sont créés ou déplacés par tranches horaires, donc si j’exécute ça dans un des trous ça suffit

  9. #9
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Parcontre bizarrement sous un ubuntu 8 desktop(oui un peu ancien) je me retrouve avec du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find: paths must precede expression: file1.txt
     Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
    Sachant que même si il marche sur une machine je dois montrer qu'il fonctionnera sur la suivante par une autre "phase test" selon la politique de la boite :/

    J'ai testé le code sous 3 formes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -mtime -1 \! -type f *.xls -print > /liste.jour | tar -cv -T /home/irwin/Documents/liste.jour -f /home/irwin/Images
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -name *.txt -exec tar -cjf /home/irwin/Documents/testeeee.tar {} \;
    ou encore la solution que j'ai posté plus haut donné par N_Bah. Je me doute qu'il me manque une condition mais je tourne un peu en rond encore une fois

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -mtime -1 \! -type f *.xls -print > /liste.jour | tar -cv -T /home/irwin/Documents/liste.jour -f /home/irwin/Images
    Attention! Avec find, il faut (quasiment) toujours mettre les globs entre apostrophes ou guillemets, c'est-à-dire remplacer *.xls par "*.xls", sinon il y a un risque d'expansion non voulu.

    De plus, il y a une erreur de syntaxe: c'est soit -type f soit -name '*.xls' soit les deux, mais joints par un -a ou -o.

    Même erreur pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Pas bon s'il existe localement un ou plusieurs fichiers *.txt
    find /home/irwin/Bureau -name *.txt -exec tar -cjf /home/irwin/Documents/testeeee.tar {} \;
    à remplacer par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -name '*.txt' -exec tar -cjf /home/irwin/Documents/testeeee.tar {} \;

  11. #11
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Merci de la réponse en effet, j'avais un doute sur une synthaxe ou quote d'où ma réouverture du sujet... Quand on est trop dedans on ne voie parfois pas l’erreur sautant pourtant aux yeux d'un autre .

    Donc la version que tu m'as fournit avec le -exec fonctionne mais il ne me compresse qu'un fichier .txt alors que j'en ai plusieurs pour mon teste.

    Citation Envoyé par jack-ft Voir le message
    à remplacer par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -name '*.txt' -exec tar -cjf /home/irwin/Documents/testeeee.tar {} \;
    J'avoue que par la suite j'y insérerai un -mtime 31pour archiver les fichiers par mois.

    J'ai voulu essayer en remplaçant le -name par un -type f mais je me retrouve encore avec le find: paths must précède expression: *.txt pourtant renseigner tel que tu me l'a corrigé.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par aerane Voir le message
    Merci de la réponse en effet, j'avais un doute sur une synthaxe ou quote d'où ma réouverture du sujet... Quand on est trop dedans on ne voie parfois pas l’erreur sautant pourtant aux yeux d'un autre .

    Donc la version que tu m'as fournit avec le -exec fonctionne mais il ne me compresse qu'un fichier .txt alors que j'en ai plusieurs pour mon teste.
    Oops! Je n'ai même pas "lu" la commande que j'ai recopiée (j'ai juste corrigé les quotes)!
    Attention! Le find exécute la partie "exec" pour CHACUN des fichiers trouvés, c'est-à-dire qu'il va créer un 1er .tar avec le 1er .txt puis écraser le même .tar avec le 2ème .txt etc. ce qui n'est probablement pas ce que tu veux.
    Si aucun des fichiers ou sous-répertoires ne contient d'espace, tu devrais préférer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -name '*.txt' -print | xargs tar -cjf /home/irwin/Documents/testeeee.tar.bz2
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tar -cjf /home/irwin/Documents/testeeee.tar.bz2 $(find /home/irwin/Bureau -name '*.txt' -print)
    PS: j'ai ajouté l'extension .bz2 parce que tu utilises l'option -j


    J'avoue que par la suite j'y insérerai un -mtime 31 pour archiver les fichiers par mois.

    J'ai voulu essayer en remplaçant le -name par un -type f mais je me retrouve encore avec le find: paths must précède expression: *.txt pourtant renseigner tel que tu me l'a corrigé.
    Plutôt qu'un long discours, c'est plus simple à faire (pour toi) et à lire (pour nous) de nous envoyer la commande que tu as utilisée et le message d'erreur correspondant.

    Je soupçonne que tu as utilisé quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -mtime -1 \! -type f '*.xls' -print # Pas bon
    Dans mon message précédent, j'ai dit qu'il fallait JOINDRE les conditions, avec quelque chose comme -a ou -o, mais surtout, il faut des conditions. Or, dans -type f '*.xls', si -type f est bien une condition valide, le reste '*.xls' n'est PAS une condition. Sémantiquement parlant, il manque -name, ce qui fait que '*.xls' est considéré comme un path (et non une condition) et que "find" n'est pas content car il veut que les paths (comme /home/irwin/Bureau) soient AVANT les conditions, d'où le message d'erreur.

    Voici un exemple de jonction OR de 2 conditions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find . -name 'to*' -o -name '*tu' 
    ./tutu
    ./toto
    ./totu
    ./bibi2/tutu
    Soit, ici (sous réserve que ce soit la sémantique que tu souhaites):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -mtime -1 \! -type f -o -name '*.xls' -print
    PS: par défaut, il y a une jointure AND implicite -a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find . -name 'to*' -name '*tu'    
    ./totu
     
    $ find . -name 'to*' -name '*to' 
    ./toto

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    Donc la version que tu m'as fournit avec le -exec fonctionne mais il ne me compresse qu'un fichier .txt alors que j'en ai plusieurs pour mon teste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... -exec tar ... \+
    il y a une différence entre \; et \+.
    la première envoi les fichiers trouvés un par un à la commande suivant l'-exec,
    l'autre envoi tous les fichiers trouvés.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Un Nieme merci pour vos réponses.

    Alors avec les fichiers du mois dernier que j'avais en test pour le mtime, en fusionnant vos 2 réponses j'ai un script tout à fait opérationnel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/irwin/Bureau -mtime -1 \! -type f -o -name '*.txt' -exec tar -cjf testeeee.tar.bz2 {} \+ -print
    J'y ai juste réinclu mon tar.bz2 (l'utilisant aussi de base) car des fichiers XLS prenant 1.6Go au total une fois la passe optimum de compression je descends à 5mo...voir moins.

    J'ai laissé le print la en affichage des fichiers compressé rien de plus

    Je commence enfin a apprécier le find comme il se doit

    Il me semble bien moins l'usine à gaz de l'épouvante avec vos explications. Puissant mais faut le comprendre.

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Bonjour,

    Si on traduit en langage claire la partie suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \! -type f -o -name '*.txt'
    On demande au find de retourner tout ce qui n'est pas de type fichier ou tout ce qui ce termine par '.txt' .
    Or dans tout ce qui n'est pas fichier, il y a entre autre les répertoires.
    Ce qui fait que dans la partie tar, tu archives dés le départ le répertoire source du find ( /home/irwin/Bureau ) ce qui revient a faire (beaucoup plus simple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tar -cjf testeeee.tar.bz2 /home/irwin/Bureau
    Et je ne parle pas des sous-répertoires retournés par le find au tar qui les archivera aussi et donc fera des archives plus volumineuses que necessaire

    Cordialement.

  16. #16
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    J'ai dit que ça fonctionne, je n'ai pas précisé le peaufinage à faire derrière

    Dans le cas présent je n'ai rien d'autre qui contient ces extensions, il s'agit d'un répertoire final.

    Bon j'avais mit ca un peu de côté pas mal de demande plus urgentes..

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2014, 17h43
  2. [MYSQL] conditions et requetes
    Par sebos63 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/02/2004, 16h41
  3. Condition sur debug et release
    Par xave dans le forum MFC
    Réponses: 3
    Dernier message: 04/02/2004, 15h04
  4. Condition et contenu TImage
    Par Detlev_linux dans le forum Langage
    Réponses: 6
    Dernier message: 23/12/2003, 01h00
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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