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 sur un script KSH


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Java
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut Aide sur un script KSH
    Bonjour,
    svp j'aurai besoin d'aide sur un script ksh.
    j'ai des fichiers sous cette formes :
    HST_HST35G02_EDP_R0+45_G02R00C00_5909_I1523254.DATAE00
    HST_HST35G02_EDP_H5+63_G02R00C00_5799_I1600063.DATAE00
    HST_HST35G02_EDP_Q2+44_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_T1+31_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_R0+14_G02R00C00_5801_I1500213.DATAE00
    parmi ces fichiers par exemple je dois déplacer ceux qui ont une combinaison incorrect dans un répertoire poubelle.

    dans mon script j'ai déclarer un tableau qui contient toutes les combinaisons correctes, ensuite j'ai fait une boucle pour le parcourir et parcourir les fichiers que je veux traiter et une condition qui permet de détecter les fausses combinaison et les déplacer :

    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
    #!/bin/ksh
    DRCFR="1G+91 2G+93 3G+91 4G+94 A0+59 B2+33 C0+54 E0+21 F4+59 H3+63 H5+07 J1+83 J2+83 J4+07 K2+34 L1+54 M1+44 N2+45 P0+33 Q2+35 R0+14 S0+21 T1+31 U1+77 U2+79 U3+74 U6+78 W4+77"
    set -A TABDRCFR $DRCFR
    FICREPEDP=$(find /data/flf/35gchg/files/rejetChg/incft_HST/ -type f | grep "HST_HST35G02_EDP")
    set -A TABFICREPEDP $FICREPEDP
    i=0
    for FICEDP in ${TABFICREPEDP[@]}
    do
    while [ $i -lt ${#TABDRCFR[@]} ]
    do
    affichEDP=`ls $FICEDP | cut -c60-64`
    if [ $affichEDP != `echo ${TABDRCFR[$i]}` ]
    then
    mv $FICEDP /data/flf/35gchg/files/rejetChg/pcr_poubelle_HST/
    else
    echo OK
    break
    fi
    i=$((i+1))
    done
    done
    mais malheureusement quand j'exécute le script, ce dernier déplace tous les fichiers ...
    quelqu'un peut m'aider sur ce script svp ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Jerniti Voir le message
    mais malheureusement quand j'exécute le script, ce dernier déplace tous les fichiers ...
    quelqu'un peut m'aider sur ce script svp ?
    Pour voir, as-tu essayé de mettre un echo devant le mv ? C'est-à-dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo mv $FICEDP /data/flf/35gchg/files/rejetChg/pcr_poubelle_HST/
    ou bien, carrément, un set -x au début du script.


    Et, attention, on n'utilise pas ls dans un script...

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Par défaut
    Bonjour.
    En lisant ton script, je vois au moins deux problèmes dans l'algorithme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pour tous les fichiers possibles (ligne 7)
        Pour toutes les combinaisons de la liste (ligne 9)
            Si le nom du fichier ne contient pas la combinaison (ligne 12)
                déplacer le fichier
    Dès que la liste de combinaisons aura au moins deux éléments distincts, il y aura au moins une raison de déplacer le fichier... et donc tous les fichiers sont déplacés. Il faut inverser le sens du test ligne 12.

    L'incrémentation de i (ligne 19) est à l'intérieur de la double boucle alors que l'initialisation est à l'extérieur de cette double boucle. Dès que le premier fichier aura été testé sur toute la liste de combinaisons, i aura une valeur > taille de la liste....

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    • pourquoi ne pas déclarer DRCFR tout de suite sous la forme d'un tableau ?
    • pourquoi ne pas déclarer FICREPEDP tout de suite sous la forme d'un tableau, et en utilisant le Développement des chemins (glogging), plutôt que find | grep qui est une mauvaise pratique, puisque find peut utiliser nativement des regex et la Substitution de commandes ne protègent pas les noms des fichiers (blancs, alinéas...) ?
    • Citation Envoyé par NBAH
      ON N'UTILISE PAS ls DANS UN SCRIPT !!!


    je n'utilise pas KSH (d'ailleurs, pourquoi KSH ?), je serais surpris qu'il ne soit pas possible de faire aussi simplement qu'en bash une simple boucle for sur le Développement des chemins du format de noms de fichiers souhaité...

    PS: n'oublie pas d'indenter ton script. Ça aide la lecture.
    mais je comprends que tu ne veuilles pas qu'on lise ça.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat fichiers.txt
    HST_HST35G02_EDP_H5+63_G02R00C00_5799_I1600063.DATAE00
    HST_HST35G02_EDP_Q2+44_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_R0+14_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_R0+45_G02R00C00_5909_I1523254.DATAE00
    HST_HST35G02_EDP_T1+31_G02R00C00_5801_I1500213.DATAE00
    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
    $ cat motifs.txt
    1G+91
    2G+93
    3G+91
    4G+94
    A0+59
    B2+33
    C0+54
    E0+21
    F4+59
    H3+63
    H5+07
    J1+83
    J2+83
    J4+07
    K2+34
    L1+54
    M1+44
    N2+45
    P0+33
    Q2+35
    R0+14
    S0+21
    T1+31
    U1+77
    U2+79
    U3+74
    U6+78
    W4+77
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -vf motifs.txt fichiers.txt                                                                                                                                                                                                                          
    HST_HST35G02_EDP_H5+63_G02R00C00_5799_I1600063.DATAE00
    HST_HST35G02_EDP_Q2+44_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_R0+45_G02R00C00_5909_I1523254.DATAE00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -vf motifs.txt fichiers.txt | xargs -ITT mv TT poubelle/

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    Citation Envoyé par Jerniti Voir le message
    Pourquoi KSH ? le projet exige son utilisation
    sur quel OS doit tourner le script ?
    es-tu tenu à une version particulière de Ksh ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre régulier
    Homme Profil pro
    Java
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    Citation Envoyé par eliot_net Voir le message
    Bonjour.
    En lisant ton script, je vois au moins deux problèmes dans l'algorithme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pour tous les fichiers possibles (ligne 7)
        Pour toutes les combinaisons de la liste (ligne 9)
            Si le nom du fichier ne contient pas la combinaison (ligne 12)
                déplacer le fichier
    Dès que la liste de combinaisons aura au moins deux éléments distincts, il y aura au moins une raison de déplacer le fichier... et donc tous les fichiers sont déplacés. Il faut inverser le sens du test ligne 12.

    L'incrémentation de i (ligne 19) est à l'intérieur de la double boucle alors que l'initialisation est à l'extérieur de cette double boucle. Dès que le premier fichier aura été testé sur toute la liste de combinaisons, i aura une valeur > taille de la liste....

    Merci pour ton retour.

    j'ai inversé le test ligne 12, cela veux dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
               if [ $affichEDP == `echo ${TABDRCFR[$i]}` ]
                then	
    			echo OK
    		else
    		mv $FICEDP /data/flf/35gchg/files/rejetChg/pcr_poubelle_HST/
    		   break
                fi
    Ensuite j'ai initialisé la variable i à l'intérieur de la double boucle, mais toujours la même chose, il me déplace tous les fichiers

    PS : je suis débutant en KSH, donc j'ai essaye de comprendre la logique

    Citation Envoyé par N_BaH Voir le message
    • pourquoi ne pas déclarer DRCFR tout de suite sous la forme d'un tableau ?
    • pourquoi ne pas déclarer FICREPEDP tout de suite sous la forme d'un tableau, et en utilisant le Développement des chemins (glogging), plutôt que find | grep qui est une mauvaise pratique, puisque find peut utiliser nativement des regex et la Substitution de commandes ne protègent pas les noms des fichiers (blancs, alinéas...) ?


    je n'utilise pas KSH (d'ailleurs, pourquoi KSH ?), je serais surpris qu'il ne soit pas possible de faire aussi simplement qu'en bash une simple boucle for sur le Développement des chemins du format de noms de fichiers souhaité...

    PS: n'oublie pas d'indenter ton script. Ça aide la lecture.
    mais je comprends que tu ne veuilles pas qu'on lise ça.

    Merci pour ton retour.

    J'avais déclaré au départ directement un tableau, mais ça n'a pas fonctionné (erreur de syntaxe et je n'arrive pas à le savoir), du coup je suis passé par une variable qui contient les combinaisons correctes et je l'ai affecté à un tableau.

    Pourquoi KSH ? le projet exige son utilisation

    PS : je suis débutant en KSH donc j'essaie de comprendre la logique

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Par défaut
    Citation Envoyé par Jerniti Voir le message
    Merci pour ton retour.

    j'ai inversé le test ligne 12, cela veux dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
               if [ $affichEDP == `echo ${TABDRCFR[$i]}` ]
                then	
    			echo OK
    		else
    		mv $FICEDP /data/flf/35gchg/files/rejetChg/pcr_poubelle_HST/
    		   break
                fi
    Ensuite j'ai initialisé la variable i à l'intérieur de la double boucle, mais toujours la même chose, il me déplace tous les fichiers

    PS : je suis débutant en KSH, donc j'ai essaye de comprendre la logique
    Là, tu as bien inversé le test (en mettant == à la place de !=), mais tu as échangé également la commande dans le then avec la commande dans le else: il n'est pas étonnant que le résultat ne soit pas meilleur qu'avant.
    Définis bien ce que tu veux faire, et ensuite tu pourras le coder. Dans son message, Flodelarab te donne une solution immédiate qui se sert de deux fichiers (celui des "motifs" et celui des "noms de fichiers"). Tape "man grep" pour les options -v et -f, et "man xargs"...

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 348
    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 348
    Par défaut
    En bash, en activant:
    on peut avoir ceci:

    Liste complète des fichiers présents dans le répertoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ printf "%s\n" *
    HST_HST35G02_EDP_H5+63_G02R00C00_5799_I1600063.DATAE00
    HST_HST35G02_EDP_Q2+44_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_R0+14_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_R0+45_G02R00C00_5909_I1523254.DATAE00
    HST_HST35G02_EDP_T1+31_G02R00C00_5801_I1500213.DATAE00
    commande pour ne garder que ceux qui ne réponde pas au pattern de la globbing:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ printf '%s\n' HST_HST35G02_EDP_!(1G+91*|2G+93*|3G+91*|4G+94*|A0+59*|B2+33*|C0+54*|E0+21*|F4+59*|H3+63*|H5+07*|J1+83*|J2+83*|J4+07*|K2+34*|L1+54*|M1+44*|N2+45*|P0+33*|Q2+35*|R0+14*|S0+21*|T1+31*|U1+77*|U2+79*|U3+74*|U6+78*|W4+77*)
    HST_HST35G02_EDP_H5+63_G02R00C00_5799_I1600063.DATAE00
    HST_HST35G02_EDP_Q2+44_G02R00C00_5801_I1500213.DATAE00
    HST_HST35G02_EDP_R0+45_G02R00C00_5909_I1523254.DATAE00
    Donc, pas besoin de boucle, un simple mv devrait suffire...

    En principe, cela fonctionne aussi en ksh (93) et je ne crois pas qu'il faille activer quoi que ce soit (mais j'ai pas moyen de tester pour l'heure).

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

Discussions similaires

  1. Demande d'aide sur un script de mise en forme..
    Par threepwood dans le forum Linux
    Réponses: 4
    Dernier message: 24/08/2007, 14h37
  2. demande d'aide sur un script
    Par threepwood dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 24/05/2007, 11h45
  3. Aide sur un script
    Par odrimont dans le forum Linux
    Réponses: 13
    Dernier message: 03/07/2006, 23h03
  4. 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