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 qui n'en fait qu'à sa tête [Débutant(e)]


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Script qui n'en fait qu'à sa tête
    Bonjour,

    j'ai fait un script qui permet de renommer les fichiers par leurs dates. Je ne comprend pas. La bouche se fait une première fois sur le premier fichier. Mais sur les fichiers suivants, elle ne s'exécute 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
    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
    clear
    #set -x
    ###
    ###TRAITEMENT DE LA DATE ===============================================
    gcc="000000"
    client="00000000"
    fichier1="fichier1"
    ddate="000000"
    nom_fichier="nom_fichier"
    cd /home/christophe/bl-clients/temp/
     
    for fichier1 in $(ls *.pdf)
    do
    	###TRAITEMENT DE LA DATE ==========================================
    	for col1 in 9 10 11 12 13
    	do
    		if (( $ddate == 000000 ))
    		then
    			ddate=$(pdfgrep --max-count 1 "Date" $fichier1 | awk -v col2=$col1 '{print $col2 }')
     
    			len=`echo $ddate |awk '{print length}'`
     
    			if [ $len -eq 7 ];
    			then
    			dateAA=$(echo $ddate | cut -b 6-7)
    			dateMM=$(echo $ddate | cut -b 3-4)
    			dateJJ=$(echo $ddate | cut -b 1)
    			dateJJ="0$dateJJ"
    			fi
     
    			if [ $len -eq 8 ];
    			then
    			dateAA=$(echo $ddate | cut -b 7-8)
    			dateMM=$(echo $ddate | cut -b 4-5)
    			dateJJ=$(echo $ddate | cut -b 1-2)
    			fi
     
    			ddate=20$dateAA$dateMM$dateJJ
    			if [[ "$ddate" =~ [0-9]{8} ]]
    			then
    				ddate=$ddate
    			else
    				ddate="000000"
    			fi
    		fi
    	done 
    	###FIN TRAITEMENT DE LA DATE ==========================================
     
    	nom_fichier=BL_$ddate\_$gcc\_$client.pdf
     
    	echo "fichier="$nom_fichier
    	read -p "enter to continue"
     
    done
    j'ai mis le script. j'explique vaguement le fonctionnement . Il cherche une date sur une ligne. ensuite il l'a cute bref un joli moulin à café.

    merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par chrisl Voir le message
    Mais sur les fichiers suivants, elle ne s'exécute pas.
    Chez-moi elle s'exécute. Donc problème réglé

    Mais puisque tu nous as mis un script, autant indiquer ce qui ne va pas
    • cd /home/christophe/bl-clients/temp/ Et si on veut travaillers ailleurs...?
    • for fichier1 in $(ls *.pdf) => quand N_BaH verra ça... => for fichier1 in *.pdf!!!
    • len=`echo $ddate |awk '{print length}'` => c'est bizarre, de partout tu as utilisé la notation récente et là, brusquement, tu passes en old-school...
    • echo "fichier="$nom_fichier => les guillemets acceptent les variables => echo "fichier=$nom_fichier"
    • if [ $len -eq 7 ]; then... if [ $len -eq 8 ]; then... => case...esac
    • nom_fichier=BL_$ddate\_$gcc\_$client.pdf => c'est quoi ces backslashes?
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    en simplifiant le code tu y verras peut-être plus clair.

    la déclaration préalable des variables n'est pas indispensable, en dehors des tableaux associatifs pour qui c'est une question de vie ou de mort, ou pour typer une variable numérique.

    pourquoi for fichier1 ? quand la boucle en sera au deuxième fichier tu vas aller éditer le script pour changer en fichier2 ?
    simplement for fichier in *.pdf, et je ne reviens pas sur le ls : tu as déjà reçu la fessée de par t par Sve@r.
    mais
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (( $ddate == 000000 ))
    si une ddate commence par un zéro, tu vas avoir une belle erreur.
    bien qu'une date semble être un nombre pour un humain, il est préférable de la comparer en tant que chaîne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    len=`echo $ddate |awk '{print length}'`
    non, non : mais ça sert à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IFS='/' read jour mois an <<<"$ddate"
    et hop ! une bonne partie du code en moins.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_fichier=BL_$ddate\_$gcc\_$client.pdf
    non,non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom="BL_${ddate}_${gcc}_$client.pdf"
    tiens! pour la route :for col in {9..13}, et pas col1
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Bonjour merci de vos réponses. j'ai corrigé le script suivant vos indications.

    le code est plus lisible

    le voila :

    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
     
    #!/bin/bash
    clear
    #set -x
    ###
    ###TRAITEMENT DE LA DATE ===============================================
    for fichier in *.pdf
    do
    echo "fichier_en_cours-$fichier"
    	###TRAITEMENT DE LA DATE ==========================================
    	for col in {9..13}
    	do
    		if (( $ddate == 000000 ))
    		then
    			ddate=$(pdfgrep --max-count 1 "Date" $fichier | awk -v col2=$col '{print $col2 }')
     
    			len=${#ddate}
     
    			if [ $len -eq 7 ];
    			then
    			dateAA=$(echo $ddate | cut -b 6-7)
    			dateMM=$(echo $ddate | cut -b 3-4)
    			dateJJ=$(echo $ddate | cut -b 1)
    			dateJJ="0$dateJJ"
    			fi
     
    			if [ $len -eq 8 ];
    			then
    			dateAA=$(echo $ddate | cut -b 7-8)
    			dateMM=$(echo $ddate | cut -b 4-5)
    			dateJJ=$(echo $ddate | cut -b 1-2)
    			fi
     
    			ddate=20$dateAA$dateMM$dateJJ
    			if [[ "$ddate" =~ [0-9]{8} ]]
    			then
    				ddate=$ddate
    			else
    				ddate="000000"
    			fi
    		fi
    	done 
    	###FIN TRAITEMENT DE LA DATE ==========================================
     
    	nom="BL_${ddate}_${gcc}_$client.pdf"
     
    	echo "fichier="$nom
    	read -p "enter to continue"
     
    done
    mais j'ai toujours ce satané bug à la noix que je ne trouve pas.
    Il prend pas la date des autres fichiers.
    J'ai mis le résultat de la commande en dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fichier_en_cours-BL-20230403-588955.pdf
    fichier=BL_20230403_000000_00000000.pdf
    enter to continue
    fichier_en_cours-BL-20230404-590658-02650052.pdf
    fichier=BL_20230403_000000_00000000.pdf
    enter to continue
    fichier_en_cours-BL-20230411-589829-02637952.pdf
    fichier=BL_20230403_000000_00000000.pdf
    enter to continue
    christophe@srv-ged01:~/bl-clients/temp$
    la variable "20230403" ne change pas. helas.

    merci de votre aide.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par chrisl Voir le message
    la variable "20230403" ne change pas. helas.
    [sarcasme]
    Normal ! Le script n'en fait qu'à sa tête !
    Autrement dit:
    le script ne fait jamais ce que je veux, il fait toujours ce que je lui demande ! (référence connue)
    [/sarcasme]

    Plus sérieusement, à la ligne 34 ddate=20$dateAA$dateMM$dateJJ, tu mets 8 chiffres dans ddate.
    À la ligne suivante if [[ "$ddate" =~ [0-9]{8} ]], tu testes si ddate contient 8 chiffres, ce qui, justement, est le cas.
    Dans la clause then ddate=$ddate, tu mets dans ddate la valeur de ddate (histoire que le CPU ne s'endorme pas, je suppose).
    Et, après la fin de boucle, au fichier suivant, à la ligne 13 if (( $ddate == 000000 )), tu testes si ddate contient 000000, ce qui n'est certainement pas le cas puisqu'elle contient les 8 chiffres de la date du premier fichier, en conséquence de quoi, le programme n'entre pas dans la clause then destinée à changer la date, si bien que la date ne sera jamais changée.

    Donc le résultat observé est conforme à ce que tu lui demandes !

    J'avoue que j'ai du mal à comprendre la raison de cette date à 000000

    Y a-t-il une (bonne) raison de ne pas recalculer systématiquement la date pour chaque fichier (c'est-à-dire de supprimer le test if (( $ddate == 000000 ))) ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Plus sérieusement, à la ligne 34...
    Moi j'ai mis pour avoir eu le courage de lire et d'analyser ce script...
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    que retourne pdfgrep pour un de ces fichiers ?

    note qu'il est aussi maladroit d'exécuter 5 fois pdfgrep, alors qu'il serait plus économique de parcourir la sortie d'une seule exécution.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    que retourne pdfgrep pour un de ces fichiers ?

    note qu'il est aussi maladroit d'exécuter 5 fois pdfgrep, alors qu'il serait plus économique de parcourir la sortie d'une seule exécution.
    Bonjour, merci de ton intervention

    pdfgrep parcoure le fichier pdf en cherchant une date.
    si la date est trouvé, il l'a renomme dans le fichier.

    par contre mon soucis c'est :

    le script garde la première valeur lors du deuxième fichier. je ne comprend pas.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    ton script est écrit aussi bien que tu le pouvais, et ça n'aide pas à la lecture de son comportement; d'autant moins qu'on n'a pas de fichier exemple pour reproduire le dysfonctionnement que tu observes.

    si les pdf que tu traites ne sont pas 'TOP SECRET" peux-tu le mettre en pièce jointe ? ou alors peux-tu en créer un similaire, et de la même manière, nous le mettre en pièce jointe ?
    il faut qu'on voit le script en action.
    là, je lirais un lorem ipsum ce serait pareil : les mots sont corrects, ça ne signifie pas que ça ait du sens.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par chrisl Voir le message
    pdfgrep parcoure le fichier pdf en cherchant une date.
    Oui, bien sûr, mais à quoi ressemble ou peut ressembler le format de cette date dans tes fichiers pdf ?

    par contre mon soucis c'est :

    le script garde la première valeur lors du deuxième fichier. je ne comprend pas.
    Essaie d'intercaler une initialisation de ddate entre les lignes 10 et 11, de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	###TRAITEMENT DE LA DATE ==========================================
    	ddate="000000"
    	for col in {9..13}
    Ça devrait aider à régler le problème (c'est toujours une bonne idée d'initialiser les variables...)

Discussions similaires

  1. Le searchSuggestThreshold d'une SearchView qui n'en fait qu'à sa tête
    Par Turvy dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 22/08/2014, 22h07
  2. Float qui n'en fait qu'à sa tête
    Par Boris56 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 14/03/2010, 14h13
  3. objet Graphics qui n'en fait qu'à sa tête
    Par poulette3000 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 24/05/2007, 20h41
  4. le menu qui n'en fait qu'à sa tête
    Par Invité dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 09/11/2006, 11h32

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