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 11/03/2025, à 20:49

cristobal78

(résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

Bonjour à tous
J'ai écrit un script pour réduire le poids de plusieurs lots de fichiers JPEG.
Il s’exécute d'un click droit sur une liste de fichiers affichés par l'explorateur "nemo"
En théorie il ramène le poids P à 0.8 x P mais en fait c'est très variable.
Ce qui est sur c'est que chaque fichier ainsi traité voit son poids diminuer significativement sans dégât sur la qualité de l'image.
Le script :

#!/bin/bash
# nom du script = jpeg-downsize-80pct
# réduit le "poids" de photos à 80% de sa valeur initiale
# Nécessite "imagemagick"

### variables
type_de_fich="jpeg"
est_pas="Fin du programme :\n\n ce fichier n'est pas au format "
list_paq_requis="imagemagick"
taux=80

### fonctions
test_format_in () { if [[ $(file --brief --mime-type "$1") != *$3 ]]; then zenity --error --text="$2 $3"; exit ; fi ; }

### script ###
while [ $# -gt 0 ] ; do
	fichier=$1
    test_format_in "$fichier" "$est_pas" "$type_de_fich"   # on sort si le fichier n'est pas jpeg

	# le fichier d'origine est conservé et le fichier de poids réduit prend le nom du fichier d'origine avec le suffixe "-80pct"
	convert "$fichier" -quality "$taux" "$fichier""-$taux"pct 
    shift
done

Résultat.
Si je n'ai sélectionné QUE des fichiers de type mime "JPEG" le script fonctionne parfaitement.
En revanche s'il rencontre sur sa route un fichier qui n'est pas JPEG alors il s’arrête.

Ce que je voudrais c'est qu'il "laisse tomber" ce fichier qui n'est pas JPEG et qu'il poursuive tranquillement sa route et traite les fichiers JPEG qui suivent.
Et là je ne vois pas comment faire  hmm

Dernière modification par cristobal78 (Le 15/03/2025, à 17:28)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Le 11/03/2025, à 21:29

kamaris

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

return 1 au lieu de exit dans test_format_in, et

test_format_in "$fichier" "$est_pas" "$type_de_fich" || continue

dans la boucle.

Hors ligne

#3 Le 11/03/2025, à 22:21

Watael

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

cette fonction ne sert à rien.

#!/bin/bash

taux=80

for fichier do
    if [[ $(file --brief --mime-type "$fichier") != *jpeg ]]
    then
        zenity --error --text="\"$fichier\" n'est pas au format JPEG"
        continue
    fi
    # le fichier d'origine est conservé et le fichier de poids réduit prend le nom du fichier d'origine avec le suffixe "-80pct"
    convert "$fichier" -quality "$taux" "${fichier/%.jpeg}-${taux}pct.jpeg" #le fichier doit rester un '.jpeg'
done

Dernière modification par Watael (Le 11/03/2025, à 22:22)


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

Hors ligne

#4 Le 12/03/2025, à 01:15

cristobal78

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

Merci à kamaris et watael.  smile

C'est la 1-ere fois que je vois cette instruction "continue"
Après avoir lu vos 2 post Je suis allé consulter le cours d'Eric Sanchis : il n'en parle pas. Puis celui de F. Lang qui l'evoque en une ligne et sans exemple de script.
Heureusement l'abs-guide  de Mendel Cooper détaille et donne des exemples !
Cela dit le bouquin de Cooper fait plus de 1000 pages et j'avoue que je nes ai pas toute lues.

@ watael
la fonction ne sert à rien si on boucle avec "for...do...done" mais est-ce aussi vrai quand on utilise, comme je l'ai fait, une boucle "while ...do ...done"   ?

Toujours pour watael :

convert "$fichier" -quality "$taux" "${fichier/%.jpeg}-${taux}pct.jpeg" #le fichier doit rester un '.jpeg'

J'ai toujours un peu de mal avec les { } au lieu des ( ) et j'ai constaté que

convert "$fichier" -quality "$taux"   "${fichier}-$(taux)pct"

fonctionne aussi très bien c'est à dire
sans / %, sans { } pour taux, et sans rajouter .jpeg

Il semble également que le paramètre -quality lève toute ambiguïté sur le mime type du fichier résultat.
Je me trompe ?

Dernière modification par cristobal78 (Le 12/03/2025, à 02:07)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#5 Le 12/03/2025, à 03:25

Watael

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

elle ne sert à rien, parce qu'à aucun moment le code de la fonction n'est réutilisé dans le script; c'est peut-être la principale raison d'être des fonctions : ne pas taper plusieurs fois le même code à différents endroits d'un script.
tu pourrais simplement mettre le if dans la boucle while (si tu tiens à itérer sur le nombre d'arguments du script, bien que ce ne soit pas ce qu'il y a de plus pratique), comme je l'ai fait dans le script que je donne en exemple.

J'ai toujours un peu de mal avec les { } au lieu des ( ) et j'ai constaté que

convert "$fichier" -quality "$taux"   "${fichier}-$(taux)pct"

fonctionne aussi très bien c'est à dire
sans / %, sans { } pour taux, et sans rajouter .jpeg

ça fonctionne*, mais pas de la même manière.
ton code donnera : /chemin/nomFichier.jpeg-80pct
alors, que celui que je montre donnera /chemin/nomFIchier-80pct.jpeg, c'est pour ça que je dis "le fichier doit rester un '.jpeg'" ("point jpeg", je ne parle pas du type, mais de l'extension), et pas un .jpeg-80pct

note aussi que le tiret ne peut pas entrer dans la composition du nom d'une variable; les Développements de paramètres qui le précède n'ont donc pas besoin d'être entre accolades.

--
* en fait, non, ça ne fonctionne pas (je n'avais pas lu d'assez près wink ). $(taux) est une Substitution de commandes et va donc vouloir interpréter taux comme une commande. Tu voulais écrire ${taux}, qui est un Développement de paramètres.


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

Hors ligne

#6 Le 12/03/2025, à 19:46

cristobal78

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

salut watael

merci pour les explications concernant l'utilisation des () et des {}  smile
Curieusement ma ligne  - fautive - avec $(taux) que je remplace immédiatement sur tes conseils par ${taux} n'avait pas provoqué de réaction quand j'avais testé mon script avec shellcheck.

Pour finir  peux tu me dire ce qui est le mieux de for ... ou de while ... pour ce genre de script.
Le script a l'air plus simple avec for mais est-ce une raison suffisante !
Après ça je refait mon script en introduisant la ligne  "continue" découverte grâce à kamaris et toi.  smile

Dernière modification par cristobal78 (Le 15/03/2025, à 16:43)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#7 Le 15/03/2025, à 15:27

Watael

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

pour itérer sur n'importe quelle liste (comme ici, dans le cas d'une itération sur la liste des arguments du script (ou d'une fonction)), la boucle "naturelle" est for parce qu'elle n'a pas besoin de commandes supplémentaires (fichier=$1, et shift).

Le script a l'air plus simple avec for mais est-ce une raison suffisante !

oui.
pense toujours KISS!


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

Hors ligne

#8 Le 15/03/2025, à 16:43

cristobal78

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

@watael

Merci pour le "baiser" !  big_smile
Donc c'est "for" qui gagne et on met (tout du moins provisoirement) "while" au rancard.

Du coup j'ai été relire la façon d'utiliser "for" et j'ai, eh oui, "encore une toute petite question", comme dirait le lieutenant Colombo.

1- for fichier ...do ....done
2- for fichier in "$@"  ...do ...done
3- for fichier in * ...do ... done

1 et 2 me semblent identiques, mais pour 3 je suis moin sûr.

Après ta réponse c'est promis je passe en résolu !

Dernière modification par cristobal78 (Le 15/03/2025, à 16:44)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#9 Le 15/03/2025, à 16:59

Watael

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

oui, 1 et2 sont équivalent.
le 3, itérera sur tous les fichiers et sous-répertoires du répertoire courant.

PS:

on met (tout du moins provisoirement) "while" au rancard.

à ce propos, si un jour tu ennvisages de faire while ! true (while not true), pense à until true. wink


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

Hors ligne

#10 Le 15/03/2025, à 17:26

cristobal78

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

watael a écrit :

sur tous les fichiers et sous-répertoires du répertoire courant.

donc bon à savoir car on risque de faire de grosses bétises en allant dans des sous répertoires !

Je passe en résolu.


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#11 Le 15/03/2025, à 20:09

Watael

Re : (résolu)Limiter l'action de la Cde "convert" aux seuls jpeg d'1 rép.

* ne descend pas dans les sous-répertoires; il liste seulement ce qui est immédiatement dans le répertoire courant (fichiers et sous-répertoires).

pour aller dans les sous-répertoires, on peut utiliser ** après avoir activé globstar avec shopt


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

Hors ligne