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 :

[Bash] Problème algorithmique


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Par défaut [Bash] Problème algorithmique
    Bonjour,

    Donc je dois faire un script qui reçoit en paramètre un répertoire et de le parcourir récursivement et de voir si le répertoire donnée en paramètre est un paquet R ou pas.
    (la fonction récursive est OK, mais lorsque je veux faire des testes que cela se complique).

    Un paquet R est un dossier qui contient les fichiers A et B et doivent être non nulle, un paquet R peut contenir (ou pas) un sous dossier R mais si ce dossier existe alors il ne doit pas être vide.
    (le répertoire donné en paramètre ne peut pas être lui même un paquet R et si on trouve un paquet R on ne doit pas vérifié que ce sous dossier possède un paquet R )

    Au départ j'ai su stocker tout les dossiers qui ont les fichiers A et B (non nulle) dans un tableau puis je pouvais les afficher, mais lorsque je teste si le dossier R est vide ça se complique.

    (j'ai déjà testé si ma commande pour voir si un fichier est vide ou pas elle est bonne mais lorsque j'imbrique le tout çà ne marche pas)

    voici mon code :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #!/bin/bash
     
     
    #------------fonction recursive--------------------
    parcour()
    {
        for item in $1/*
        do
            [ ! -d "$item" ] && continue
            if checkR "$item"
                then
                    echo "$item"
            else
                parcour "$item"
     
            fi
        done
     
    }
     
     
    #-------------------reperer les paquets R----------------------
    checkR()
    {
     
    message="false"
     
    [ ! -s "$1/A" ] && [ ! -s "$1/B" ] && message="true"
     
    if [ -d "$1/R" ] && [ ! $(ls "$1/R" | wc -l) -gt 0 ]
    then
    message="false"
    fi
     
    [ $message="true" ] && return 1 || return 0
     
     
    }
     
    #---------------------------------------------------------------
     
    resultat=$(parcour $1)
     
    #stock les paquet R dans un tableau
    read -a tableau <<<$resultat
     
    for var in "${tableau[@]}"
    do
         echo "${var}"
    done
     
     
    exit
    Aidez-moi please, je sais vraiment pas ce qui cloche,

    Je vous remercie

    Dean.

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test "$message" = true && return 1 || return 0
    il faut des espaces autour du =.

    deux choses qui ne sont pas des erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test -d "$item" || continue
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read -a tableau < <(parcour "$1")
    et, le toujours : ON N'UTILISE PAS ls DANS UN SCRIPT !!! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabTemp=( "$1/R/"* )
    if [ -d "$1/R" ] && [ ${#tabTemp[@]} -le 0 ]
    PS: pour tester ton code, il faudrait nous donner les moyens de reproduire ton arborescence de test (mkdir, touch...).
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Par défaut
    il y'a toujours un problème avec cette fonction :

    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
     
    checkR()
    {
     
    message="false"
     
    [ ! -s "$1/A" ] && [ ! -s "$1/B" ] && message="true" || message="false"
     
    tabTemp=( "$1/R/"* )
     
    if [ -d "$1/R" ] && [ ${#tabTemp[@]} -le 0 ]
    then
    message="false"
    fi
     
    test "$message" = "true"  && return 1 || return 0
     
     
    }

    Je pense que le problème vient du fait qu'il ne teste pas R, voici le dossier que je donne en paramètre :

    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
     
    dossierXY:
     
    dossierXY/01
                 /01/A (fichier nn vide)
                 /01/B (fichier nn vide)
                 /01/R (dossier nn vide)         
    dossierXY/02
                 /02/A (fichier nn vide)
                 /02/B (fichier nn vide)
                 /02/R (dossier nn vide)  
    dossierXY/03
                 /03/A (fichier nn vide)
                 /03/B (fichier nn vide)
                 /03/R (dossier nn vide)  
    dossierXY/04
                 /04/A (fichier nn vide)
                 /04/B (fichier nn vide)
                 /04/R (dossier vide)  
    dossierXY/05
                 /05/A (vide)
                 /05/B (vide)
                 dossier R inexistant 
    dossierXY/06
                 (vide)
    lorsque j'exécute mon script j'obtiens :
    dossierXY/01
    dossierXY/02
    dossierXY/03
    dossierXY/04

    je remarque que le 5 n'est pas affiché car en effet les fichier A et B son vide
    et le 6 n'est pas affiché car A et B son inexistant,
    mais le 4 ne devrai pas s'afficher car il a un dossier R mais vide (même si A et B son des fichier non vide)

    voyez vous ce qui cloche?

    Merci d'avance!

    Dean

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Bonjour,

    Pour le cas du repertoire 4, en bash, il suffit que tu active l'option nullglob et que tu vérifie si la chaine est vide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ ls ./R #Pour montrer que le repertoire est vide
    $ tabTemp=( "./R/"* )
    $ test -z ${tabTemp[@]}
    $ echo $?
    1
    $ shopt -s nullglob
    $ test -z ${tabTemp[@]}
    $ echo $?
    0
    $ touch ./R/x
    $ test -z ${tabTemp[@]}
    $ echo $?
    1

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

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

    Recherche récursive => find

    Perso, je ferais une liste des dossiers R qui alimenterait un while read ligne dans lequel je testerais toutes les petites conditions pour afficher ou supprimer la-dite ligne.

    Je pars toujours du principe que traiter un fichier texte ligne par ligne est plus agréable.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Par défaut
    En fait j'ai essayé ma condition pour voir si le dossier R existe et non vide, lorsque je la lance dans un script à part cela fonctionne, mais lorsque que je met dans ma fonction checkR() çà ne marche pas, je sais vraiment pas comment faire ça me bloque

Discussions similaires

  1. [débutant] [BASH] problème script backup
    Par julien.63 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/04/2008, 18h56
  2. [BASH]Problème création d' un script
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 05/11/2007, 15h34
  3. [BASH] Problème dans une boucle IF
    Par coincoin22 dans le forum Linux
    Réponses: 3
    Dernier message: 16/08/2007, 09h34
  4. Problème (algorithmique) de tri de nombres
    Par t26 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/07/2007, 12h51
  5. [BASH] problème alias, histoire de fork ?
    Par dosy07 dans le forum Administration système
    Réponses: 2
    Dernier message: 13/06/2007, 21h00

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