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

  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

  7. #7
    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
    Merci j'ai su y arriver mais un petit problème persiste, le dossier ayant un sous dossier R vide ne s'affiche plus tout est correct mais :

    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
    checkR()
    {
     
    [ ! -s "$1/A" ] && [ ! -s "$1/B" ] && message="true" || message="false"
     
    if [ -d "$1/R" ]; then
     
    shopt -s dotglob nullglob
    fichiers=( "$1/R/"* )
    (( ${#fichiers[@]} )) && message="false" || message="true"
    shopt -u dotglob nullglob
     
    fi
     
    test "$message" = "true"  && return 1 || return 0
     
     
    }
    Tout à l'air de fonctionner mais si je regarde bien, il effectue le teste pour voir si R existe et non vide apres avoir vérifier le sous fichier A et B (non vide), du coup si les fichiers A et B son vide ou inexistant mais que le dossier R est présent et non vide alors 'message' sera a "true", donc j'ai pensé a tout simplement rajouter a coté de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ -d "$1/R" ] && [ message = "true" ]; then
    Lorsque je fais ça tout ne fonctionne plus, ça m'affiche tout les dossier.

  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
    Bonjour.

    Bon j'ai pas lu la discussion complète, mais ceci m'a interpelé :

    Citation Envoyé par bigXboss Voir le message
    donc j'ai pensé a tout simplement rajouter a coté de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ -d "$1/R" ] && [ message = "true" ]; then
    Lorsque je fais ça tout ne fonctionne plus, ça m'affiche tout les dossier.
    Il manque à minima un $ devant la variable message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ -d "$1/R" ] && [ $message = "true" ]; then
    Ensuite, il est préférable de protéger ses variables :

    - soit en les encadrant par des doubles quotes lorsque l'on utilise test ou [.
    - soit en privilégiant la syntaxe bash des doubles crochets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ -d "$1/R" && $message = "true" ]]; then
    Tu remarquera par ailleurs qu'il n'est pas utile de multiplier les tests, l'opérateur "ET" est supporté à l'intérieur des doubles crochets (avec test et [ tu as l'option -a qui est équivalente => man test).

    Cordialement,
    Idriss

  9. #9
    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
    Merci j'avais pas remarqué,

    j'ai essayé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if [[ -d "$1/R" && $message = "true" ]]; then
    mais ça m'affiche quand même des dossier qui ne devrai pas (si j’enlève la condition avec message a "true" ça fonctionne mais quand je teste cette condition ça ne veut plus)

    voici ma 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()
    {
     
    [ ! -s "$1/A" ] && [ ! -s "$1/B" ] && message="true" || message="false"
     
    if [[ -d "$1/R" && $message = "true" ]]; then
     
    shopt -s dotglob nullglob
    fichiers=( "$1/R/"* )
    (( ${#fichiers[@]} )) && message="false" || message="true"
    shopt -u dotglob nullglob
     
    fi
     
    test "$message" = "true"  && return 1 || return 0
     
     
    }
    Normalement avec ça il regarde si A et B son pas vide alors message est a "true" puis pour vérifié que le dossier R existe et non vide il doit regardé si message est a "true" (car on ne vérifie pas R si A et B son vide ou inexistant) puis si le dossier R existe et est non vide message reste a "true" sinon il est a "false" puis on teste message et on renvois 1 ou 0 si il est a true ou false, mais ca ne fonctionne pas, il m'affiche le répertoire avec un sous répertoire R vide, (je voudrai testé si le sous répertoire R est non vide dans une condition séparé du A et du B car c'est pas le seul sous répertoire que je dois testé)

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par bigXboss Voir le message
    Tout à l'air de fonctionner mais si je regarde bien, il effectue le teste pour voir si R existe et non vide
    Non, test -d vérifie juste si $1/R existe en tant que répertoire (la caractéristique vide/non vide n'est pas testée)...
    Citation Envoyé par bigXboss Voir le message
    apres avoir vérifier le sous fichier A et B (non vide), du coup si les fichiers A et B son vide ou inexistant mais que le dossier R est présent et non vide alors 'message' sera a "true", donc j'ai pensé a tout simplement rajouter a coté de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ -d "$1/R" ] && [ message = "true" ]; then
    Lorsque je fais ça tout ne fonctionne plus, ça m'affiche tout les dossier.
    Tu ne voudrais pas nous détailler ce que "checkR" doit vérifier afin qu'on comprenne un peu mieux ce que tu veux faire STP ???

    Accessoirement tu as un connecteur "and" directement accessible dans le test => if [ -d "$1/R" -a "$message" = "true" ]; then ce qui t'évite de l'appeler 2 fois (n'oublie pas que le shell est interprété...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    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
    Je vais recoller tout mon script je pense çà sera plus simple mais avant je vais expliqué ce que je dois faire,
    voici l’énoncé :

    <<Concevez, en Bash, un script rextract.sh permettant a ses utilisateurs de mettre en evidence des repertoires correspondant a des paquets R ainsi que leurs caracteristiques. Le script recoit en parametre un repertoire suppose contenir zero, un ou plusieurs repertoires representant des paquets R. Le repertoire passe en parametre ne peut lui-meme pas representer un tel paquet. Les repertoires representant un paquet R peuvent avoir le repertoire passe en parametre comme ancetre direct ou indirect.

    Un repertoire representant un paquet R contient les fi chiers texte non vides DESCRIPTION et NAMESPACE ainsi que les sous-repertoires R,data,demo,exec,man,po,src,tests,tools et vignettes. Chacun de ces sous-repertoires peut ne pas etre present, mais tout repertoire present parmi ceux listes ci-avant doit contenir au moins un chier. D'autres fi chiers et repertoires peuvent egalement etre trouves, mais ils sont ignores de R.>>

    Ensuite sur c'est paquet R je dois les traité, mais je souhaite tout d'abord repérer ces paquet R (je vérifie que les sous dossier R pour le moment) : voici mon script déja :

    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
    55
    56
     
    #!/bin/bash
     
     
    #------------boucle qui stock les dossiers--------------------
    parcour()
    {
    	for item in $1/*
    	do
    		[ ! -d "$item" ] && continue
    		if checkR "$item"
    			then
    				echo "$item"
    		else
    			parcour "$item"
     
    		fi
    	done
     
    }
     
     
    #-------------------repere les paquet R----------------------
    checkR()
    {
     
    [ ! -s "$1/NAMESPACE" ] && [ ! -s "$1/DESCRIPTION" ] && message="true" || message="false"
     
     
    if [ -d "$1/R" ] && [ $message = "true" ]; then
    shopt -s dotglob nullglob
    fichiers=( "$1/R/"* )
    (( ${#fichiers[@]} )) && message="false" || message="true"
    shopt -u dotglob nullglob
    fi
     
    test "$message" = "true" && return 1 || return 0
     
    }
     
    #------------------------------------------------------------
     
    #stock les paquet R dans un tableau
     
    resultat=$(parcour $1)
     
    for var in "${resultat[@]}"
    do
     
    echo "${var}"
     
    done
     
    #------------------------------------------------------------
     
    exit
    dans cette condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ -d "$1/R" ] && [ $message = "true" ]; then
    lorsque je remplace true par false tout fonctionne, (je donne a mon script un repertoire qui contient 6 paquet R, un 7 eme que j'ai crée qui contients un fichier namespace et description non vide mais pas de paquet R, il me l'affiche, j'ai crée un dossier avec un namespace et description non vide mais un paquet R vide il me l'affiche aussi !! et quand je remplace le true avec false, il me l'affiche pas, normalement $message doit etre true, je comprend plus rien...

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bigXboss Voir le message
    [ ! -s "$1/NAMESPACE" ] && [ ! -s "$1/DESCRIPTION" ] && message="true" || message="false".
    Un repertoire representant un paquet R contient les fi chiers texte non vides DESCRIPTION et NAMESPACE
    Ben voilà (une de tes) erreurs !!!
    Pour que le checkR valide, il faut les deux (l'un et l'autre). Pour qu'il ne valide pas, il faut que l'un ou l'autre n'y soit pas (loi de DeMorgan)
    Toi, tu as codé "si aucun des deux n'y est, alors le message est à faux" (donc tu valides si l'un ou l'autre y est...)

    Voici mon code
    Code bash : 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
    #!/bin/bash
     
    checkR()
    {
    	# Parenthèses obligatoires pour rendre les variables locales à la fonction (sinon collision surtout au niveau de "$d")
    	(
    		# Si le dossier ne contient pas l'un des deux fichiers, il ne valide pas
    		test ! -s "$1/DESCRIPTION" -o ! -s "$1/NAMESPACE" && return 1
     
    		# Vérification de la présence d'au-moins un sous-dossier non vide
    		for d in R data demo man po src tests tools vignettes
    		do
    			# Si le dossier est présent et contient au-moins un fichier, il valide
    			test -d "$1/$d" && ls -d "$1/$d/"* 1>/dev/null 2>&1 && return 0			# Le "ls" juste pour N_Bah, je sais qu'il appréciera...;)
    		done
     
    		# Le dossier ne valide pas
    		return 1
    	)
    }
     
    for dossier in $*
    do
    	find "$dossier" -mindepth 1 -type d -print |sort |while read d
    	do
    		checkR "$d" && echo "$d"
    	done
    done

    Voici mon jeu d'essai (je mentionne les dossiers qui valident le test et ceux qui ne valident pas)
    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
    base
    |-- [drwxr-xr-x]  base/d1 (ne valide pas, le dossier R est vide)
    |   |-- [-rw-r--r--]  base/d1/DESCRIPTION
    |   |-- [-rw-r--r--]  base/d1/NAMESPACE
    |   `-- [drwxr-xr-x]  base/d1/R
    |-- [drwxr-xr-x]  base/d2 (valide)
    |   |-- [-rw-r--r--]  base/d2/DESCRIPTION
    |   |-- [-rw-r--r--]  base/d2/NAMESPACE
    |   `-- [drwxr-xr-x]  base/d2/R
    |       `-- [-rw-r--r--]  base/d2/R/passwd
    |-- [drwxr-xr-x]  base/d3 (ne valide pas, manque le fichier "NAMESPACE")
    |   |-- [-rw-r--r--]  base/d3/DESCRIPTION
    |   `-- [drwxr-xr-x]  base/d3/R
    |       `-- [-rw-r--r--]  base/d3/R/passwd
    |-- [drwxr-xr-x]  base/d4 (valide)
    |   |-- [-rw-r--r--]  base/d4/DESCRIPTION
    |   |-- [-rw-r--r--]  base/d4/NAMESPACE
    |   `-- [drwxr-xr-x]  base/d4/po
    |       `-- [-rw-r--r--]  base/d4/po/passwd
    |-- [drwxr-xr-x]  base/d5 (valide)
    |   |-- [-rw-r--r--]  base/d5/DESCRIPTION
    |   |-- [-rw-r--r--]  base/d5/NAMESPACE
    |   `-- [drwxr-xr-x]  base/d5/tools
    |       `-- [-rw-r--r--]  base/d5/tools/passwd
    |-- [drwxr-xr-x]  base/f1 (ne valide pas car vide)
    |-- [drwxr-xr-x]  base/f2  (ne valide pas car vide)
    `-- [drwxr-xr-x]  base/f3 (ne valide pas car vide)
    Et le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    moi@virtualux:~$ ./rextract.sh base
    base/d2
    base/d4
    base/d5
    moi@virtualux:~$
    Ce qui correspond bien à mon jeu d'essai...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    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
    MERCII !!!!

    En fait je pensais que return 1 (== vrai) et return 0 (== faux) !!

    Et pour les testes je pensais que $message prenais true uniquement si les deux ne sont pas vide, c'est pour ça que rien ne fonctionnait !!! merci encore

  14. #14
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test -d "$1/$d" && ls -d "$1/$d/"* 1>/dev/null 2>&1 && return 0
    je l'ai remplacés par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test -d "$1/$d" && ! ls -d "$1/$d/"* 1>/dev/null 2>&1 && return 1
    et j'ai mis return 0 a la fin

    car sinon il testait que le premier dossier, si c'est vrai il retournait directement 0 sans testé les autres dossiers, et les dossiers qui ont namespace et description non vide (sans avoir les dossiers de teste) était négliger.

    Encore MERCI !

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bigXboss Voir le message
    Citation Envoyé par bigXboss Voir le message
    ...ainsi que les sous-repertoires R,data,demo,exec,man,po,src,tests,tools et vignettes. Chacun de ces sous-repertoires peut ne pas etre present, mais tout repertoire present parmi ceux listes ci-avant doit contenir au moins un chier...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test -d "$1/$d" && ls -d "$1/$d/"* 1>/dev/null 2>&1 && return 0
    et j'ai mis return 0 a la fin
    car sinon il testait que le premier dossier, si c'est vrai il retournait directement 0 sans testé les autres dossiers, et les dossiers qui ont namespace et description non vide (sans avoir les dossiers de teste) était négliger.
    Ben oui, quand tu dis "chacun de ces sous-répertoires peut ne pas être présent" ça signifie qu'il en faut juste un seul...

    Citation Envoyé par bigXboss Voir le message
    je l'ai remplacés par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test -d "$1/$d" && ! ls -d "$1/$d/"* 1>/dev/null 2>&1 && return 1
    Pas tous à fait.
    Moi j'en cherchais un seul qui corresponde, donc qui ait toute les caractéristiques ("exister" et "non-vide").

    Toi, tu les cherches tous. Donc Faut faire l'inverse. Considérer qu'ils y sont tous par défaut et en chercher un qui ne corresponde pas, à savoir ("ne pas exister" ou "être vide") !!!

    Faut vraiment que tu apprennes les lois de "DeMorgan", à savoir
    • non (A OU B) = non(A) ET non(B) => inverser un (A OU B) revient à inverser(A) ET inverser(B)
    • non (A ET B) = non(A) OU non(B) => inverser un (A ET B) revient à inverser(A) OU inverser(B)


    Donc le test devrait être ( test -d "$1/$d" || ! ls -d "$1/$d/"* 1>/dev/null 2>&1 ) && return 1 !!!

    Ceci dit, je viens de remarquer un détail qui a son importance, à savoir "mais tout repertoire present parmi ceux listes ci-avant doit contenir au moins un fichier"
    Cela signifie donc (désolé, j'avais pas fait gaffe) qu'un dossier peut ne pas y être mais que s'il y est, il faut alors qu'il ne soit pas vide.

    Donc en réalité, la fonction doit-être programmée ainsi
    Code bash : 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
    checkR()
    {
    	(
    		# Si le dossier ne contient pas l'un des deux fichiers, il ne valide pas
    		test ! -s "$1/DESCRIPTION" -o ! -s "$1/NAMESPACE" && return 1
     
    		# Test de la validité des dossiers - On considère que par défaut, le répertoire actuel ne valide pas
     
    		# Vérification de la présence d'au-moins un sous-dossier non vide
    		for d in R data demo man po src tests tools et vignettes
    		do
    			# Si le dossier est présent
    			if test -d "$1/$d"
    			then
    				# S'il est vide, alors il ne valide pas et c'est définitif
    				! ls -d "$1/$d/"* 1>/dev/null 2>&1 && return 1
     
    				# Le dossier devient temporairement valide
    				valid="true"
    			fi
    		done
     
    		# Renvoi du test de validité final - Si la variable "valid" existe et qu'elle est remplie alors c'est que le dossier est valide
    		test -n "$valid" && return 0 || return 1
    	)
    }

    Citation Envoyé par bigXboss Voir le message
    En fait je pensais que return 1 (== vrai) et return 0 (== faux) !!
    Compréhensible. Mais pas en shell.
    En shell, on considère qu'il n'y a qu'une raison pour que ça soit bon (0) mais qu'il y a plusieurs possibilités d'échec. Et donc la valeur renvoyée (entre 1 et 255) permet d'indiquer (si on le désire) la cause réelle de l'échec...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    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
    Merci Sve@r ! oui je connais très bien la loi de DeMorgan, juste que en shell comme tu as dis tout est différent, je programme en JAVA habituellement et la condition était que NAMESPACE soit non-vide ET que DESCRIPTION soit non-vide pour que $message prenne "true" sinon il prend "false" dans les autres cas, (en JAVA if ( namespace!= null && description!= null) { message=true;}),

    MERCI !

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