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 :

Aide de demarrage sur un script perso


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Aide de demarrage sur un script perso
    Bonjour,

    Je vous sollicite pour vous demander une aide sur mon script :

    Je souhaite que mon script supprime un dossier de plus de 31 jours à partir de la date de creation du dossier en question.

    Dites moi si je fais fausse route dans la construction :

    les dossiers sous sous cette forme :
    |
    | jours |
    -----------| 10-11-2008
    -----------| 11-11-2008
    -----------| 12-11-2008

    * j'affiche la date du jour
    * j'extrais la date du jour en prenant le nombre du jour en variable (a)
    * je liste le contenu du dossier jours en faisant une boucle (for)
    * je mets en variable (b) la liste
    * j'extrais le nombre du jour (qui etait le nom du dossier) en variable (c)
    * avec une condition : si c + 31 > a alors supprimer le dossier

    Est-ce que ma théorie est bonne ? ou y a t-il plus simple ?

  2. #2
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour,

    C'est pas très clair:
    • j'affiche la date du jour --> pourquoi pas.
    • j'extrais la date du jour en prenant le nombre du jour en variable (a) --> gni? Si on est le 14 nov, tu récupères 14, c'est ça?
    • je liste le contenu du dossier jours en faisant une boucle (for) --> pourquoi pas faire un ls ou un echo *?
    • je mets en variable (b) la liste --> dans la même commande que la ligne précédente.
    • j'extrais le nombre du jour (qui etait le nom du dossier) en variable (c) --> c'est la date du mois?
    • avec une condition : si c + 31 > a alors supprimer le dossier --> si a est une date dans le mois, alors la condition c + 31 > a sera (quasiment) toujours vraie puisque a <= 31.
    Sans savoir exactement ce que tu fais, difficile de te donner des conseils...
    Un problème bien posé est déjà résolu (H. Bergson).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Effectivement, voici d'autres explications auquelles je reponds en italique :

    J'affiche en gras, ce qui est valide, vrai et applicable.


    * j'affiche la date du jour --> pourquoi pas.
    * j'extrais la date du jour en prenant le nombre du jour en variable (a) --> gni? Si on est le 14-11-2008, tu récupères 14, c'est ça? Oui
    * je liste le contenu du dossier jours en faisant un ls --> pourquoi pas faire un ls ou un echo *? oui, un ls
    * je mets en variable (b) la liste --> dans la même commande que la ligne précédente.
    * j'extrais le nombre du jour de la variable (b) et je cree la variable (c) qui correspond au jour : exemple : pour le dossier 12-11-2008 ; la variable (c) sera 12 --> c'est la date du mois?
    * Je dis alors avec une condition : si c + 31 < a alors ne pas supprimer le dossier sinon le supprimer --> si a est une date dans le mois, alors la condition c + 31 > a sera (quasiment) toujours vraie puisque a <= 31.
    exemple sur ce dernier point : si c (12, dans mon exemple) + 31 < a (14, dans notre exemple)

    Exact ; dans un cas ou dans l'autre ; çà ne marche pas ; je pense qu'il faut que je recupere aussi la variable du mois et mettre une sous condition.

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Tu peux utiliser find -exec sinon
    http://man.developpez.com/man1/find.1.php
    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

  5. #5
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Il ne faut pas ré-inventer la roue. Comme c'est un nombre de jours depuis maintenant, comme l'a dit ggnore, la commande find peut faire ça très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ "$(find dir -daystart -atime +31)" = "" ]
    then
        echo "Fichiers trop jeunes"
    else
        rm -rf dir
    fi
    J'imagine qu'il faudra paramétrer dir.
    Un problème bien posé est déjà résolu (H. Bergson).

  6. #6
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    comme l'a dit ggnore, le paramètre exec de la commande find simpifie la tâche.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find /home/user -type d -mtime +31 -exec rm -rf {} \;
    Cette commande supprimera tous les réperoires à partir de "/home/user" de plus de 31 jours.
    Un petit "man find" te donnera tous les paramètres de cette commande fort utile.

  7. #7
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    En relisant, je crois que le problème n'est pas bien décrit. Alors 74manu74, pourrais-tu expliquer en français ce que tu veux faire, et donner les noms des répertoires et fichiers.

    Par exemple:
    Dans un répertoire nommé 31, il y a des fichiers de la forme 14-11-2008. Dès que les fichiers sont plus vieux que 31 jours (nom du répertoire), alors il faut supprimer le répertoire entier.
    Un problème bien posé est déjà résolu (H. Bergson).

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    En effet, je vais vous réexpliquer mon besoin :

    J'ai un repertoire jours dans lequel nous trouvons des repertoires du type : 10-11-2008 qui eux même contiennent des fichiers (pour mes sauvegardes). Les dossiers du type 10-11-2008 sont créés automatiquement le 10 novembre 2008 en l'occurrence. Je souhaite qu'au bout de 31 jours ; ce dossier soit supprimé du dossier jours ; de façon à ce que chaque "dossiers date" aient une rétention de 31 jours.

    Après avoir regarder et pris connaissance de la fonction find ; celle-ci correspond parfaitement à mon problème. Je vais l'essayer et je vous remercie d'avance.

  9. #9
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Maintenant, ça me paraît clair. Voici une solution.
    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
    #!/bin/bash
    cd jour
    for dir in $(ls)
    do
        echo $dir | awk -F '-' '
        {
            dateSec = mktime("$3 $2 $1 12 00 00")
            nowSec = systime()
            diffDay = (nowSec - dateSec) / 86400
            if (diffDay > 31)
            {
                system("rm -rf $0")
            }
        }'
    done
    Le code n'est pas testé du tout, donc il y a surement des erreurs. J'ai décomposé avec des noms que je pense clairs. J'expliquerai les détails ce weekend, pas le temps aujourd'hui.
    Un problème bien posé est déjà résolu (H. Bergson).

  10. #10
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Attention avec la commande find: un répertoire prend la date de la dernière modif des fichiers qu'il contient. Il suffit de changer un fichier ou d'en ajouter un autre pour que le répertoire prenne cette date. Je ne l'ai lu nulle part, c'est d'expérience. Peut-être me trompé-je... Mais vu qu'un répertoire n'est qu'un fichier contenant une liste de fichiers, cela ne m'étonne qu'à moitié.
    Un problème bien posé est déjà résolu (H. Bergson).

  11. #11
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    A vérifier, je n'ai pas d'unix sous la main, il y deux options permettant de différentier création et modification :
    mtime
    ctime

    Encore une fois, c'est à vérifier.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Je vais tester avec la fonction find et le code de jmelyn.

    Je rajouterai egalement que l'utilisateur a la possibilité de restaurer ses fichiers tout seul ; et qu'il a les droits d'ecriture dans ce dossier. Donc je vais faire des essais de façon à voir si le repertoire ne change pas au niveau de la date si par hasard l'utilisateur met un fichier depuis sa restauration...
    juste pour info : mon user utilise : WinScp pour faire ses restorations depuis sa machine Windows.

    Je vous retiens au courant ce soir.

    Edit

    Le script de Jmelyn me parait bien ; cependant, je peux egalement utiliser la fonction 'find' car dans le dossier : 13-11-2008 ; j'ai toujours un repertoire nommé : reference dans lequel se trouve tous les fichiers sauvegardés.
    Je confirme que lorsque je mets un fichier dans reference ; le dossier prend la nouvelle date mais pas le dossier 13-11-2008 ; donc parfait pour mon cas.


    J'ai appris beaucoup de choses avec cette fonction ! merci à vous !

  13. #13
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Attention tout de même:

    Si un utilisateur (ou même toi) crée un fichier au même niveau que le répertoire référence, alors la date du répertoire parent jj-mm-aaaa changera et la commande find ne fonctionnera plus comme prévu. Et pour trouver une telle erreur, c'est pas évident. Alors que le script utilisant awk, lui, fonctionnera toujours.
    Un problème bien posé est déjà résolu (H. Bergson).

  14. #14
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Bonjour,

    J'ai fait un petit scripte y'a pas si longtemps qui a pour but de garder propre la poubelle réseau. C'est pas du shell, mais du perl, mais ça peut faire le travail voulu.

    En fait mon serveur samba ne supprime pas les fichiers quand un utilisateur les supprimes, ils les déplacent dans un autre partage. Ce partage est prévu pour garder les fichiers durant 7 jours (et uniquement le propriétaire peut y accéder). Ce script permet donc de supprimer les fichiers plus vieux, envoyer quelques statistiques et (dans la parties commentées (je sais, c'est pas bien, mais c'est comme ça)) envoyer une liste aux utilisateurs des fichiers qu'ils ont dans la corbeille (mais ils n'en veulent pas de ces mails).

    Donc si ça peut servir, il est là (avec un fichier de configuration d'exemple).
    Fichiers attachés Fichiers attachés
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Maintenant, ça me paraît clair. Voici une solution.
    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
    #!/bin/bash
    cd jour
    for dir in $(ls)
    do
        echo $dir | awk -F '-' '
        {
            dateSec = mktime("$3 $2 $1 12 00 00")
            nowSec = systime()
            diffDay = (nowSec - dateSec) / 86400
            if (diffDay > 31)
            {
                system("rm -rf $0")
            }
        }'
    done
    Le code n'est pas testé du tout, donc il y a surement des erreurs. J'ai décomposé avec des noms que je pense clairs. J'expliquerai les détails ce weekend, pas le temps aujourd'hui.
    Bonsoir,

    Peux tu m'expliquer la fonction des variables $3 ; $2 ; $1 ET pourquoi on divise par 86400 ?
    merci

  16. #16
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    86400 = 24 * 60 * 60
    CQFD
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  17. #17
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonsoir,

    J'ai essayé de nommer les variables pour comprendre leur utilité, même si c'est en anglais (plus court, en général, que le français):
    dateSec: nombre de secondes depuis Epoch jusqu'à la date
    nowSec: nombre de secondes jusqu'à maintenant
    diffDay: différence (entre les deux dates), comptée en nombre de jours

    La commande awk est est monde à elle toute seule. Quelques explications sur le code:

    Option -F: elle détermine comment chaque ligne du fichier sera découpée en mot. D'habitude c'est l'espace qui délimite les mots, mais ici j'ai choisi le tiret '-'. Les simples guillemets sont inutiles, ils montrent mieux le caractère que j'ai choisi (question de style).

    Donc, awk coupe la première ligne en mots, travaille dessus selon le programme qu'on lui a fourni, puis passe à la ligne suivante pour faire le même travail (dans la version simple), jusqu'à ce que le fichier soit entièrement parcouru.

    Afin de travailler sur les mots, il est nécessaire de les nommer. C'est le rôle des $i: $1 est le premier mot de la ligne, $2 le second, etc. $0 est particulier, c'est la ligne entière.

    Il existe des fonctions à l'intérieur de awk, comme mktime() qui traduit une date format humain (AAAA MM JJ HH MM SS) en format ordi (nombre de secondes depuis Epoch, c'est-à-dire le 1er janvier 1970). J'ai mis 12 qui est le nombre d'heures pour être en milieu de journée et pas inquiété par les changements d'horaires été - hiver.

    86400 secondes = 1440 minutes = 24 heures = 1 jour. Il est des valeurs bonnes à connaître. Comme le nombre de secondes depuis Epoch: ce sera 1 milliard 230 millions un peu avant Noël (1 milliard de secondes, ça fait quasiment 32 années).
    Un problème bien posé est déjà résolu (H. Bergson).

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    ok ! Merci pour les explications !

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    J'ai encore une petite question :

    Je souhaite mettre en variable un ls un peu special. (et mettre tout ce qui n'a pas l'extension .doc dans le repertoire soft. J'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mkdir /mon/repertoire/jour/reference/soft
    cd /mon/repertoire/jour/reference
    variable=ls | grep -v [.doc]$
    mv $variable /mon/repertoire/jour/reference/soft
    Ma question : Est-ce que j'ai le droit d'appeler une variable dans une commande telle que : mv

  20. #20
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Oui, parfaitement, les variables sont faites pour cela. Mais voici ce que je ferais, sans aucune variable puisque c'est simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cd /mon/repertoire/jour/reference
    mkdir -p soft
    mv $(ls | grep -v .doc$) soft
    Un problème bien posé est déjà résolu (H. Bergson).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. demande d'aide sur un script
    Par threepwood dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 24/05/2007, 11h45
  2. Programme pour booter au demarrage sur un script
    Par undercrash dans le forum Linux
    Réponses: 3
    Dernier message: 01/03/2007, 14h43
  3. Aide sur un script
    Par odrimont dans le forum Linux
    Réponses: 13
    Dernier message: 03/07/2006, 23h03
  4. A l'aide svp j'ai de gros problemes sur un script php
    Par schtek2 dans le forum Langage
    Réponses: 1
    Dernier message: 24/04/2006, 01h25
  5. Besoin d'aide sur un script SQL de recherche
    Par agougeon dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/10/2005, 11h40

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