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 :

Script en shell


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Script en shell
    bonjour a tous! je suis débutante en informatique .et j'aimerai que vous m'aidiez s'il vous plait a résoudre cet exercice.je suis la des heures a chercher mais rien.voici ma question
    Faites un script en Shell du nom de nettoyer_repertoire avec un nombre variable de paramètres qui sont des répertoires existants dans le répertoire courant. Pour chacun des répertoires nommés, votre script doit déplacer tous ses fichiers au répertoire courant. Si les noms des fichiers sont identiques, votre script doit concaténer les fichiers sous un même nom dans le répertoire courant, SAUF s'il s'agit d'un fichier de type PDF où votre programme élimine simplement ce dernier fichier. Quand les répertoires nommés en paramètre sont vidés, ils doivent être détruits.

  2. #2
    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 : 33
    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
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonsoir.

    As-tu essayé quelque chose ? Qu'est-ce qui te bloque ?

    Sinon voici quelques documents qui te seraient surement utile, ou du moins qui contiennent suffisamment d'informations pour parvenir à réaliser cet exercice (et largement)



    Avec tout ça tu as de quoi te former. Nous préférons éviter de donner des solutions toutes faites. Essayes donc de nous proposer quelque chose en fonction de ce que tu auras compris des cours ci-dessus et nous t'aiderons à corriger

    Cordialement,
    Idriss

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    merci pour les lien voici ce que j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    for fichier in  $*
    do exist= ${file}
    if [-f $ exist];
    then * rep cat output file
    else cp $ file/*$file/...
    else if [[$ file==file.pdf]]
    rm-f file.pdf

    je sais que c'est pas tout a fait mais est ce je suis sur la voix j'ai l'ides mais j'arrive pas a faire un bon script

  4. #4
    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 : 33
    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
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Tout d'abord, il faut prendre l'habitude d'indenter son code, afin qu'il soit plus lisible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    for fichier in  $*; do 
        exist= ${file}
        if [-f $ exist]; then 
            * rep cat output file
        else 
            cp $ file/*$file/...
        else if [[$ file==file.pdf]]
           rm-f file.pdf
    Donc là on voit plusieurs problèmes

    P1) un bloc if - elif -else se termine par un fi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if cond1; then
        # ...
    elif cond2; then
       # ...
    else
        # ...
    fi
    Je te renvoie à cette partie du cous shell que je t'ai donné en haut : http://frederic-lang.developpez.com/...e=page_9#LIX-C

    Tu remarquera aussi qu'on ne met pas un else avant un elif (correspondant au "else if"), le else correspond aux derniers cas de tests possibles (tout ceux qui ne matchent pas les conditions des blocs précédents).

    P2) Il faut des espaces de part et d'autres des crochets (équivalents de la commande test) :

    Même chose avec les doubles crochets :

    Tu remarquera que dans le cas du test avec crochets simples, je protège les opérandes avec des doubles quotes (").
    Je te renvoie à ceci : http://ineumann.developpez.com/tutor...ratiques/#LI-B

    P3) Pour parcourir la liste des fichiers du répertoire courrant c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for file in *; do
        # ...
    done
    # ou si on veux préciser le répertoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DIR="/chemin/du/repertoire"
    for file in "$DIR"/*; do
        # ...
    done
    Lire cet article de la FAQ au passage : http://linux.developpez.com/faq/?pag...ns-les-scripts

    Tu remarquera au passage qu'une boucle se termine par un "done" de la même façon qu'un bloc if se termine par un "fi" et qu'un bloc "case" se termine par un "esac".
    Encore une fois les syntaxes des structures de contrôles et itératives sont toutes définies dans ce cours : http://frederic-lang.developpez.com/...ux/prog-shell/

    P3) Pas d'espaces entre le $ et le nom de tes variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if [-f $ exist]; then
    else if [[$ file==file.pdf]]
    Autres remarques :

    R1) Les accolades ne servent à rien dans ton cas (${file}). Elles sont utiles pour délimiter les variables quand c'est nécéssaire comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "babla${truc}blibli"
    echo "${array[$i]}
    R2) Pour tester l'extension d'un fichier pdf, tu t'y prends mal. Tu pourrais passer par une regexp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if [[ $file =~ .*\.pdf$ ]]; then
        # ...
    fi
    Les doubles crochets permettent d'utiliser l'opérateur =~ permettant de matcher des regexp en bash 3 et plus.

    Voilà, essayes de te documenter un peu plus et d'effectuer toutes ces corrections sur ton script, on verra pour la suite.

    Cordialement,
    Idriss

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    après quelques recherches et en m'inspirant de ce que vous m'aviez donné je suis rendu la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    Dir="/home/netttoyer_repertoire/rep";
    for file in "$Dir"/*;do
        exist=$file;
        #ici j'aimerai concatener les fichiers identiques sous le même nom
        if[ -f $exist ]; then
             cat $file>$exist
        elif [[ $file =~.*\.pdf$ ]]; then
            #est ce que en faisant cette commande je nettoie le fichier pdf qui est dans mon répertoire?
            rm nettoyer_repertoire/* -Rf;
        else
            cp $file/*$file/
        fi
    done
    voila ce que j'ai pu trouver je suis un peu confuse .en plus je sais pas si j'ai bien déplacer tous les fichiers dans le répertoire

  6. #6
    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 : 33
    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
    Points : 19 452
    Points
    19 452
    Par défaut
    Re bonsoir.

    Bon encore une fois attention à l'indentation (et l'utilisation des balises code au passage), j'ai tout rectifié

    A part ça, pourquoi dupliquer la variable $file dans une variable $exist ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for file in "$Dir"/*;do
        exist=$file; # pourquoi dupliquer dans une nouvel
        #ici j'aimerai concatener les fichiers identiques sous le même nom
        if[ -f $exist ]; then
             cat $file>$exist
             # ...
        fi
    done
    Ici tu ne fera que rediriger la sortie de cat $file dans $exist qui est aussi $file
    Sans compter que l'opérateur de redirection ">" écrase le contenu du fichier à l'inverse de ">>".

    Voici une correction à tester, adapter, etc :

    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
    #!/bin/bash
     
    dossierANettoyer="..."
    dossierDeDestination="..."
     
    for file in "$dossierANettoyer"/*; do
        # correction 1 : il faut redonner le bon chemin au fichier de destination auquel on doit concaténer 
        # le contenu du fichier déplacé portant le même nom s'il existe 
        nameFile=$(echo $file|awk -F "/" '{print $NF}') # extraction du nom du fichier
        fichierDeDestination="$dossierDeDestination/$nameFile"
     
        # correction 2 : on commence par traiter le cas particulier (le pdf)
        # test -f va également prendre en compte les fichiers pdf sinon
        # et attention aux espaces de part et d'autres de l'opérateur =~
        if [[ $file =~ .*\.pdf$ ]]; then
            # correction 3 : suppression correcte du fichier PDF
            rm -rf "$file"
        elif [ -f "$fichierDeDestination" ]; then # correction 4 : on protège ses opérandes avec la syntaxe [ ou la commande test
             # correction 5 : on agrège le contenu du fichier à déplacer dans le fichier de destination
             cat "$file" >> "$fichierDeDestination"
             # correction 6 : on oublis pas de supprimer le fichier derrière
             rm -rf "$file"
        else
            # correction 7 : on déplace le fichier, on ne le supprime pas
            mv "$file" "$dossierDeDestination"
        fi
    done
    Maintenant une version un peu plus optimale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    dossierANettoyer="..."
    dossierDeDestination="..."
     
    for file in "$dossierANettoyer"/*; do
        nameFile=$(echo $file|awk -F "/" '{print $NF}')
        fichierDeDestination="$dossierDeDestination/$nameFile"
        [[ $file =~ .*\.pdf$ ]] || cat "$file" >> "$fichierDeDestination" # Si c'est pas un pdf, j'agrège (et je crée si fichier inexistant)
        rm -rf "$file" # suppression du répertoire à nettoyer dans tout les cas
    done
    Tu devrait exactement avoir le même comportement avec cette version

    Cordialement,
    Idriss

    P.S : n'ayant pas testé, il se peut qu'il y ait des coquilles

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    merciiiiiiii je vais le tester de ce pas .je pense que je vais m'en sortir je comprend mieux maintenant!
    merciiiii pour ton aide

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    woooh maintenant je m'aperçois de mes erreurs je pense qu'il faut que je m'y mette vraiment. Au fait merci pour les liens ça va beaucoup m'aider. Bon weekend à tous!

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

Discussions similaires

  1. [AIX] Outil de debogage des scripts k-shell
    Par medora dans le forum AIX
    Réponses: 1
    Dernier message: 19/05/2007, 12h14
  2. création script korn shell de recopie de fichiers
    Par jeje4 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 29/03/2007, 07h38
  3. Problème avec mon script en Shell
    Par G.D.O dans le forum Linux
    Réponses: 8
    Dernier message: 05/07/2006, 16h40
  4. [ASE 12.5.1] Execution de scripts / commandes shell
    Par zayro dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 24/02/2006, 10h47
  5. aides pour script en shell
    Par komatek dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 12/08/2003, 15h36

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