Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/02/2017, à 22:23

Ermite28

[Résolu] Problème d'expressions régulières.

Bonjour à tous !
Voilà, je me suis mis à la réalisation de mon tout premier script perso en bash. L'idée c'est d'avoir un script qui modifie le nom de mes photos pour ne pas qu'elles aient le nom barbare que l'appareil photo leur donne. J'ai donc commencé mon script:

#!/bin/bash
for imageJPG in `ls *.jpg`
do
        let "nbr = 0"
        let "nbr = $nbr+1"
        mv $imageJPG $nbr.jpg
done

for imagePNG in `ls *.png`
do
        let "nbr = $nbr+1"
        mv $imagePNG $nbr.png
done

for imageGIF in `ls *.gif`
do
        let "nbr = $nbr+1"
        mv $imageGIF $nbr.gif
done

J’obtiens donc quelque chose du genre lorsque je l'execute. Et c'est ce que je veux smile
370378Capturedu20170225205708.png

Le problème provient lorsque mes images ont des espace ou  des underscores. Elles sont alors supprimées Et je ne comprend pas pourquoi, puisque le * correspond à n'importe quel caractère...

ben@pcbenoit:~/Images/test$ ls
15965505_1388996967797689_2391693131160467595_n.jpg
16299404_10212074462002447_3700685428576156831_n.jpg
16387868_10208145891303588_5783923589841118150_n.jpg
16387909_1388997961130923_964227602126922738_n.jpg
16388199_10211924928901651_5846839131716589622_n.jpg
16388347_10211924938261885_698956025007745038_n.jpg
16388428_10212370316791682_8751635322206915814_n.jpg
16388437_10212074460322405_6437291011182972510_n.jpg
16406536_10211924942261985_1727693885391435619_n.jpg
16406596_10212370336952186_7928133320176475894_n.jpg
16406714_10211924928941652_8064783437206156018_n.jpg
16406717_10212074457882344_2885249045240441718_n.jpg
16406725_10212370322271819_1563672028075281422_n.jpg
16406871_10212370336992187_525186639595536454_n.jpg
16406888_1321407311251533_7289825019229315886_n.jpg
16406945_10212074466322555_396708535960883346_n.jpg
1.jpg
2.png
3.png
4.png
5.png
triage.sh
ben@pcbenoit:~/Images/test$ ./triage.sh 
mv: '1.jpg' et '1.jpg' identifient le même fichier
mv: '2.png' et '2.png' identifient le même fichier
mv: '3.png' et '3.png' identifient le même fichier
mv: '4.png' et '4.png' identifient le même fichier
mv: '5.png' et '5.png' identifient le même fichier
ls: impossible d'accéder à '*.gif': Aucun fichier ou dossier de ce type
ben@pcbenoit:~/Images/test$ ls
1.jpg  2.png  3.png  4.png  5.png  triage.sh

Voilà, dites moi si vous voyez ce qu'il cloche smile

Dernière modification par Ermite28 (Le 26/02/2017, à 14:42)

Hors ligne

#2 Le 25/02/2017, à 22:37

pingouinux

Re : [Résolu] Problème d'expressions régulières.

Bonsoir,
Tu peux essayer ceci, d'abord sur une copie des fichiers pour tester.

#!/bin/bash
nbr=0
for imageJPG *.jpg
do
        mv -i "$imageJPG" $((++nbr)).jpg
done

for imagePNG in *.png
do
        mv -i "$imagePNG" $((++nbr)).png
done

for imageGIF in *.gif
do
        mv -i "$imageGIF" $((++nbr)).gif
done

Demande si tu as besoin d'explications sur certains points.

Hors ligne

#3 Le 25/02/2017, à 22:42

Watael

Re : [Résolu] Problème d'expressions régulières.

salut,

bah, oui. l'utilisation de substitution de commandes dans une boucle for est problématique lorsque la sortie (ici des noms de fichiers) comporte des caractères "invisibles",
parce que for parcourt des mots, et non des lignes.

heureusement, le shell est arrivé, et a tout résolu avec le Développement des chemins et les Motifs génériques !

for f in *.{jpg,png,gif}; do case $f in *jpg) nb=$((nbJPG++));; *png) nb=$((nbPNG++));; *gif) nb=$((nbGIF++));; esac; echo mv "$f" "$nb.${f##*.}" done

si ça fonctionne, enlève le echo

PS: je viens de voir qu'il n'est peut-être pas nécessaire compter chaque type de fichiers différemment.
c'est un peu moins drôle :

for f in *.{jpg,png,gif}; do echo mv "$f" "$((++nb)).${f##*.}" done

PS2 : et, au fait, quelles expressions régulières ?

Dernière modification par Watael (Le 25/02/2017, à 23:06)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 25/02/2017, à 22:57

Ermite28

Re : [Résolu] Problème d'expressions régulières.

Super ça fonctionne ! Merci beaucoup
J'ai juste rajouté un in sur la 3éme ligne.

Je comprend ton code, mais je ne comprend quel est la différence avec le mien qui fait que le tien fonctionne puisque la seule différence se trouve dans la manière de noter l'incrémention...

Hors ligne

#5 Le 25/02/2017, à 23:14

Watael

Re : [Résolu] Problème d'expressions régulières.

le shell protège les Développements des chemins, pas les Substitutions de commandes !


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 26/02/2017, à 00:45

Ermite28

Re : [Résolu] Problème d'expressions régulières.

Oups sorry, je viens de voir ta réponse Watael, j'avais commencer à écrire avant que tu n'envois ton message...
Merci pour l'explication. smile J'ai remarqué que tu as fais le script avec des conditions, je pense que je vais garder ma méthode comme ça je ne mélange pas les types de fichiers (même si ça ne change pas grand chose finalement...)

J'ai nommé mon sujet expression régulière car je pensais que mon problème venait de là, mais apparement non

Hors ligne

#7 Le 26/02/2017, à 01:02

Watael

Re : [Résolu] Problème d'expressions régulières.

en fait, les expressions régulières, c'est autre chose. cf. man 7 regex
ici, ce sont des motifs génériques.
ouvre le man bash
puis tape ceci :

/^ *Motifs génériques

la barre inclinée ouvre la barre de recherche de less (le pager de man),
la suite, elle, est une expression régulière.
le chapitre du man décrit ce que sont les Motifs génériques.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 26/02/2017, à 08:26

pingouinux

Re : [Résolu] Problème d'expressions régulières.

Ermite28 #4 a écrit :

Je comprend ton code, mais je ne comprend quel est la différence avec le mien qui fait que le tien fonctionne puisque la seule différence se trouve dans la manière de noter l'incrémention...

  1. J'ai remplacé

    for imageJPG in `ls *.jpg`

    par

    for imageJPG in *.jpg

    Sinon, un fichier dont le nom contient des espaces est vu comme plusieurs fichiers (un underscore ne gêne pas).

  2. Dans la boucle sur les *.jpg, tu réinitialisais nbr à chaque fichier. Il ne t'en restait plus qu'un seul, appelé 1.jpg.

  3. J'ai remplacé

            mv $imageJPG $nbr.jpg

    par

            mv -i "$imageJPG" $((++nbr)).jpg

    Sans les " ", des espaces dans le nom du fichier vont mettre la pagaille.
    Avec mv -i, une question est posée si la destination existe déjà.

Hors ligne

#9 Le 26/02/2017, à 11:00

Ermite28

Re : [Résolu] Problème d'expressions régulières.

Watael a écrit :

en fait, les expressions régulières, c'est autre chose. cf. man 7 regex
ici, ce sont des motifs génériques.
ouvre le man bash
puis tape ceci :

/^ *Motifs génériques

la barre inclinée ouvre la barre de recherche de less (le pager de man),
la suite, elle, est une expression régulière.
le chapitre du man décrit ce que sont les Motifs génériques.

Merci, j'ai compris la nuance maintenant, je vais encore m’entraîner un peu à utiliser les expressions régulières c'est bien puissant ! smile

Merci pingouinux, j'ai bien compris mes erreurs smile

pingouinux a écrit :

Dans la boucle sur les *.jpg, tu réinitialisais nbr à chaque fichier. Il ne t'en restait plus qu'un seul, appelé 1.jpg.

Je me sens bête de ne pas l'avoir vu cette erreur la tongue

Hors ligne

#10 Le 26/02/2017, à 11:51

Hizoka

Re : [Résolu] Problème d'expressions régulières.

Salut, si c'est bon ajouter un RESOLU dans ton titre wink


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne