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 :

Comparaison nom de répertoire et date


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 24
    Par défaut Comparaison nom de répertoire et date
    Bonjour bonjour,

    J'ai un script qui crée un répertoire toutes les heures avec le nom suivant, variant en fonction de l'heure et la date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_repertoire=$(date %Y%m%d-%h)     # nom_repertoire = 20140507-17
    J'aimerais savoir si il est possible de faire une comparaison entre le nom des répertoires (et non la date de modification) et la date actuelle.

    Si oui, pouvoir supprimer les répertoires étant vieux de plus de 10 jours.

    Merci d'avance,

    John

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ dateDelete=$(date -d -10days +%Y%m%d)
    $ nom_repertoire=20140506-17
    $ test ${nom_repertoire%-*} -lt $dateDelete && echo "rm $nom_repertoire" || echo "on garde $nom_repertoire"
    on garde 20140506-17
    ${nom_repertoire%-*} enlève le tiret et ce qui le suit.

    <mode jedi = on>tu n'utiliseras pas ls pour parcourir les noms des répertoires<mode jedi = off>
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Bonjour,

    Si ta date est locale, tu vas tenter de créer une fois par an un dossier qui existe déjà.

  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,
    Vraiment pour le fun
    L'ensemble de fichiers:
    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
    $ find . -name "BOB_*"
    ./BOB_20140413-27
    ./BOB_20140414-26
    ./BOB_20140415-25
    ./BOB_20140416-24
    ./BOB_20140417-23
    ./BOB_20140418-22
    ./BOB_20140419-21
    ./BOB_20140420-20
    ./BOB_20140421-19
    ./BOB_20140422-18
    ./BOB_20140423-17
    ./BOB_20140424-16
    ./BOB_20140425-15
    ./BOB_20140426-14
    ./BOB_20140427-13
    ./BOB_20140428-12
    ./BOB_20140429-11
    ./BOB_20140430-10
    ./BOB_20140501-9
    ./BOB_20140502-8
    ./BOB_20140503-7
    ./BOB_20140504-6
    ./BOB_20140505-5
    ./BOB_20140506-4
    ./BOB_20140507-15
    ./BOB_20140507-3
    ./BOB_20140508-2
    Ici, on affiche (on aurait pu faire un -exec rm {} \; à la place du -print pour les effacer) que les fichiers dont la date dans le nom de fichier a plus de 10 jours:
    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
    $ eval find . $(printf "%s" "-not -name 'BOB_$(date -d -"{0..9}"days +%Y%m%d)-*' " ) -name \'BOB_*\' -print
    ./BOB_20140413-27
    ./BOB_20140414-26
    ./BOB_20140415-25
    ./BOB_20140416-24
    ./BOB_20140417-23
    ./BOB_20140418-22
    ./BOB_20140419-21
    ./BOB_20140420-20
    ./BOB_20140421-19
    ./BOB_20140422-18
    ./BOB_20140423-17
    ./BOB_20140424-16
    ./BOB_20140425-15
    ./BOB_20140426-14
    ./BOB_20140427-13
    ./BOB_20140428-12
    Après, faut vraiment aimer "eval"

    PS: Je ne savais pas qu'il existait des années de 10 jours seulement ....

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Le post-scriptum semble m'être destiné. Je précise donc ma pensée: L'heure locale implique un décalage horaire qui fera, au printemps, un jour où il manquera un dossier et un jour, en automne, où le dossier que l'on veut créer existera déjà. Pas besoin de balayer l'année pour voir le phénomène. Même pas les dix jours. Juste deux heures.

    Désolé pour le dérangement.

  6. #6
    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
    +1.

    C'est vrai, je n'avais pas fait le rapprochement

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    L'heure locale implique un décalage horaire qui fera, au printemps, un jour où il manquera un dossier et un jour, en automne, où le dossier que l'on veut créer existera déjà. Pas besoin de balayer l'année pour voir le phénomène. Même pas les dix jours. Juste deux heures.
    C'est pour ca que souvent, lorsqu'on a besoin de manipuler des fichiers avec des dates, on travaille en temps universel.


    Sinon, pourquoi pas simplement un find . -mtime +10 ? Bon, bien sur, ca ne fonctionne pas pour 2 heures, mais vu que ce n'est pas la question initiale
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    <mode jedi = on>tu n'utiliseras pas ls pour parcourir les noms des répertoires<mode jedi = off>
    <yoda>pour parcourir les noms des répertoires, ls tu n'utilisera pas</yoda>

    Sinon en reprenant l'idée de N_Bah, quelque chose de ce style ne conviendrait pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dateDelete="$(date -d -10days +%Y%m%d)"
    for dir in *; do
        [[ -d $dir && $dir =~ ^[0-9]{8}\-[0-9]*$ && ${dir%-*} -lt $dateDelete ]] && echo "$dir à supprimer"
    done
    Idriss

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    shopt -s nullglob # s'il n'y a pas de répertoire correspondant au motif, ne pas afficher le motif
    dateDelete="$(date -d -10days +%Y%m%d)"
    printf -v rad '[0-9]%.s' {1..8} # construit le motif racine 8x [0-9]
    for dir in $rad-[0-9]*/ # le slash final permet de ne montrer que les répertoires, cela évite `test -d $dir'
    do
       test ${dir%-*} -lt $dateDelete && echo "$dir à supprimer"
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    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
    Je suis d'accord avec vous, surtout si derrière on ne maitrise pas les pattern de find...

    Sinon, voici une autre version avec find un peu plus propre (sans eval ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%s" "$(date -d -"{0..9}"days +%Y%m%d)\\\|" | xargs -IREG find . -type d -not -regex './\(REG\)-[0-9]*' -name '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9]*' -exec echo rm -r {} \;
    Ici, j'utilise l'option -regex au lieu de -name ce qui réduit la taille du find. Le printf fabrique la partie variable de la regex (les 3 anti-slash sont importants) et cette partie variable est passé au find via xargs.

    Au final, le find ressemble à quelque chose de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type d -not -regex './\(20140510\|20140509\|20140508\|20140507\|20140506\|20140505\|20140504\|20140503\|20140502\|20140501\|\)-[0-9]*' -name '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9]*' -exec echo rm -r {} \;
    Reste plus qu'a retirer le echo de la partie -exec echo rm -r {} \; pour que le rm devienne actif.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    il y a un problème : ça fonctionne parce qu'il y a un bug dans bash-4.2
    la solution de disedorgue ne fonctionnait pas avec ma version (4.3) , alors je suis aller geindre sur la liste des bugs.

    j'ai eu plusieurs réponses impressionnantes de la part Dan Douglas (contributeurs sur wiki.bash-hackers.org), qu'il ne juge pas sérieuses, et je ne reproduirais pas ici;
    et, enfin, une qui semble pouvoir être reproduite dans le temps et que je vous transmets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf 'now - %d days\n' {0..9} | date -f - +%Y%m%d | sed ':a;N;s/\n/\\\|/;ta'
    20140511\|20140510\|20140509\|20140508\|20140507\|20140506\|20140505\|20140504\|20140503\|20140502
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/10/2012, 13h46
  2. Possiblité d'utiliser des noms de répertoires
    Par vicelard dans le forum Access
    Réponses: 4
    Dernier message: 27/10/2005, 11h04
  3. Lire le nom du répertoire courant !
    Par Feustine dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2005, 14h33
  4. nom de répertoire contenant des accents
    Par isa38 dans le forum Windows
    Réponses: 6
    Dernier message: 21/07/2005, 10h27
  5. Réponses: 2
    Dernier message: 08/07/2005, 10h40

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